English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
C#では、これらのデータ型がメモリ内で値を保存する方法に基づいてカテゴリ分けされます。C#には以下のカテゴリのデータ型が含まれます:
値型
参照型
ポインタ型
データ型が自分自身のメモリ空間にデータ値を保存する場合、それは値型です。これは、これらのデータ型の変数が値を直接含んでいることを意味します。
すべての値型はSystem.ValueTypeを継承し、さらにSystem.ValueTypeさらにSystem.Object継承。
たとえば、整数変数int i = 100;
システムは100は変数iに割り当てられたメモリ空間に保存されます。以下の図は、100は「i」のメモリ(0x239110)中的某个仮定位置:
以下数据类型均为值类型:
bool
byte
char
decimal
double
enum
float
int
long
sbyte
short
struct
uint
ulong
ushort
値型変数を一つのメソッドから別のメソッドに渡すと、別のメソッド内で変数の独立したコピーが作成されます。一つのメソッドで値を変更しても、別のメソッド内の変数には影響を与えません。
static void ChangeValue(int x) { x = 200; Console.WriteLine(x); } static void Main(string[] args) { int i = 100; Console.WriteLine(i); ChangeValue(i); Console.WriteLine(i); }
100
200
100
上記の例では、Main()メソッド内の変数iをChangeValue()メソッドに渡し、その値を変更した後でも、それが変わらないままです。
値型とは異なり、参照型はその値を直接保存しません。代わりに、値を保存している場所のアドレスを保存します。言い換えれば、参照型は他のデータを保存する場所を指すポインタを含みます。
例えば、以下の文字列変数:
string s = "Hello World!!";
以下の図は、システムが上記の文字列変数にメモリを割り当てる方法を示しています。
上図のように、システムは変数sにメモリ内のランダムな位置(0x803200)。変数sの値は0x600000、これは実際のデータ値のメモリアドレスです。したがって、参照型は値自体ではなく、実際の値が保存されている場所のアドレスを保存します。
以下は参照型データ型です:
文字列
配列(要素が値型であっても)
クラス
デリゲート
参照型変数を一つのメソッドから別のメソッドに渡すと、新しいコピーを作成しません;代わりに、変数のアドレスを渡します。したがって、メソッド内で変数の値を変更すると、呼び出しメソッドにも影響を与えます。
static void ChangeReferenceType(Student std2) { std2.StudentName = "Steve"; } static void Main(string[] args) { Student std1 = new Student(); std1.StudentName = "Bill"; ChangeReferenceType(std1); Console.WriteLine(std1.StudentName); }
Steve
上記の例では、Studentオブジェクトstd1 ChangeReferenceType()メソッドに渡されます。ここでは、実際にはstdを渡しています。1のメモリアドレスです。したがって、ChangeReferenceType()メソッドがStudentNameを変更する場合、実際にはstd1のStudentNameオブジェクト、なぜならstd1とstd2メモリの同一アドレスを指します。
参照型変数のデフォルト値nullは、未初期化時です。 Nullは、何も参照していないことを示します。
値型変数はnullにすることができません。なぜなら、それはメモリのアドレスを保存するのではなく、値を保存するからです。C#2バージョン0.0では、nullを割り当てることができる可変型が導入されました。それを使うと、値型変数にnullを割り当てたり、値を割り当てずに値型変数を宣言することができます。