回答:
nullNullable<T>、ゼロで初期化された値を返しますNullable<T>それが空(疑似ヌル)の値を返します(実際には、これが最初の箇条書きの再文ですが、それは明示的にそれを作る価値があります)の最大の用途default(T)はジェネリックで、Try...パターンのようなものです:
bool TryGetValue(out T value) {
if(NoDataIsAvailable) {
value = default(T); // because I have to set it to *something*
return false;
}
value = GetData();
return true;
}
たまたま、フィールドや変数を初期化するのが面倒なコード生成でも使用していますが、タイプがわかっている場合は、次のようにします。
bool someField = default(bool);
int someOtherField = default(int)
global::My.Namespace.SomeType another = default(global::My.Namespace.SomeType);
default。オーバーロードすることはできません。
int foo = default(int);同じでしたかint foo;?つまり、初期化されていないintは、デフォルトで同じ値になりdefault(int)ませんか?
default(...)ます。ローカルにはデフォルト値がありません(技術的には.locals init、IL では再びデフォルトがゼロになることを意味しますが、安全でないメカニズムを使用して監視する必要があります)
defaultキーワードはnull、参照タイプおよびzero数値タイプに対して返されます。
以下のためstructの、それが値または参照タイプであるかどうかに応じて、ゼロまたはヌルに初期化構造体の各メンバーを返します。
Simple Sample code :<br>
class Foo
{
public string Bar { get; set; }
}
struct Bar
{
public int FooBar { get; set; }
public Foo BarFoo { get; set; }
}
public class AddPrinterConnection
{
public static void Main()
{
int n = default(int);
Foo f = default(Foo);
Bar b = default(Bar);
Console.WriteLine(n);
if (f == null) Console.WriteLine("f is null");
Console.WriteLine("b.FooBar = {0}",b.FooBar);
if (b.BarFoo == null) Console.WriteLine("b.BarFoo is null");
}
}
出力:
0
f is null
b.FooBar = 0
b.BarFoo is null
のデフォルト値MyObject。ジェネリックコードの既定のキーワード(C#プログラミングガイド)(MSDN)を参照してください。
ジェネリッククラスとジェネリックメソッドで発生する問題の1つは、事前に次のことを知らない場合に、パラメーター化された型Tにデフォルト値を割り当てる方法です。
- Tが参照型または値型になるかどうか。
- Tが値の型の場合、数値または構造体のどちらになるか。
パラメーター化された型Tの変数tが与えられた場合、ステートメントt = nullは、Tが参照型であり、t = 0が数値型に対してのみ機能し、構造体に対しては機能しない場合にのみ有効です。解決策は、デフォルトのキーワードを使用することです。これは、参照タイプの場合はnullを返し、数値タイプの場合はゼロを返します。構造体の場合、それが値型か参照型かに応じて、ゼロまたはnullに初期化された構造体の各メンバーを返します。GenericListクラスの次の例は、defaultキーワードの使用方法を示しています。詳細については、ジェネリックスの概要を参照してください。
public class GenericList<T>
{
private class Node
{
//...
public Node Next;
public T Data;
}
private Node head;
//...
public T GetNext()
{
T temp = default(T);
Node current = head;
if (current != null)
{
temp = current.Data;
current = current.Next;
}
return temp;
}
}
defaultキーワードを返す要求された型の変数のための「デフォルト」または「空」の値。
(で定義されたすべての参照型のためclass、delegateなど)、これがありますnull。(で定義された値型のためstruct、enumなど)には、(例えば、すべてゼロの値だint 0、DateTime 0001-01-01 00:00:00など)。
null値型の変数に割り当てることができないため、主に参照型と値型の両方に適用できる汎用コードで使用されます。
おそらくこれはあなたを助けるかもしれません:
using System;
using System.Collections.Generic;
namespace Wrox.ProCSharp.Generics
{
public class DocumentManager < T >
{
private readonly Queue < T > documentQueue = new Queue < T > ();
public void AddDocument(T doc)
{
lock (this)
{
documentQueue.Enqueue(doc);
}
}
public bool IsDocumentAvailable
{
get { return documentQueue.Count > 0; }
}
}
}
ジェネリック型にnullを割り当てることはできません。その理由は、ジェネリック型も値型としてインスタンス化でき、nullは参照型でのみ許可されているためです。この問題を回避するには、デフォルトのキーワードを使用できます。デフォルトのキーワードでは、nullが参照型に割り当てられ、0が値型に割り当てられます。
public T GetDocument()
{
T doc = default(T);
lock (this)
{
doc = documentQueue.Dequeue();
}
return doc;
}
デフォルトのキーワードは、それが使用されるコンテキストに応じて複数の意味を持ちます。switchステートメントは、デフォルトのケースを定義するためにデフォルトを使用します。ジェネリックでは、デフォルトを使用して、ジェネリックタイプを参照タイプと値タイプのどちらであるかに応じて、nullまたは0に初期化します。
ジェネリック型パラメーターを参照型に制限する制約が適用されていない場合、構造体などの値型も渡すことができます。このような場合、構造体を空にすることはできますが、nullにすることはできないため、typeパラメータをnullと比較すると、常にfalseになります。
不正なコード
public void TestChanges<T>(T inputValue)
try
{
if (inputValue==null)
return;
//operation on inputValue
}
catch
{
// ignore this.
}
}
修正された
public void TestChanges<T>(T inputValue)
try
{
if (object.Equals(inputValue, default(T)) )
return;
//operation on inputValue
}
catch
{
// ignore this.
}
}
class Fooプロパティで作成した場合int n。「オーバーロード」defaultして代わりnに言うように設定できますか?50