これは、値の型と参照の型の違いに関係しています。
「データ型は、独自のメモリ割り当て内にデータを保持する場合、値型です。」一方、「参照型には、データを保持する別のメモリ位置へのポインターが含まれています。」
値のタイプの一般的な例:
- すべての数値データ型
- ブール値、文字、および日付
- メンバーが参照型であっても、すべての構造体
- 基になる型が常に SByte、Short、Integer、Long、Byte、Short、UInteger、または ULong であるため、列挙型
参照型の一般的な例:
- 弦
- 要素が値型であっても、すべての配列
- Formなどのクラスの種類
- デリゲート
すべての値型はデフォルト値 (数値型の場合はゼロ) に初期化され、参照型は を指しnull
ます。
以下の宣言:
int num;
変数を初期化しませんnum
。したがってnum
、使用できません。C# では、各変数を使用する前に何らかの値 (null
または数値) に設定する必要があります。
同じことが参照型にも当てはまります。
//un-initialized, therefore cannot be used until a value is given(A compiler error will occur)
string str;
ただし、次の宣言:
int[] numbers = new int[5];
配列が初期化され (したがって、配列のコンストラクターが呼び出され)、各要素が int の既定値 (つまりゼロ) に初期化されます。
参照型で同じメソッドを使用すると、同じ結果が得られます。
string[] strings = new string[5];
配列が初期化されるため、null
文字列の配列が作成されます (これはすべての参照型の既定値です)。
構造体は、探しているデータ型です。構造体は値型であるため、 に設定することはできませんnull
。に設定できないためnull
、何らかのデフォルト値が必要です。デフォルト値は、デフォルト コンストラクターによって決定されます。
構造体は次のように定義できます。
struct MyStructName
{
//Members of the struct, like a class, default value is 0.
int myNumber;
//Structs can have members whose data type is a reference type
//Default value is null.
string myString;
//Every struct has a default constructor, though you cannot define one.
//The compiler generates one for you that initializes every member to it's
//default value.
}
これにより、に設定できないメンバー myNumber および myString を含むデータ型が定義されnull
ます。
//Array of MyStructName, the default constructor is called and each value is initialized
MyStructName[] data = new MyStructName[5];
//Loop and print results
for(int i = 0; i < data.Length; i++)
{
//Prints the index, number and the string or "null"
Console.WriteLine("{0}: myNumber: {1}, myString: \"{2}\"", i, data[i].myNumber, data[i].myString != null ? data[i].myString : "null");
}