English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

C# 値型と参照型

C#では、これらのデータ型がメモリ内で値を保存する方法に基づいてカテゴリ分けされます。C#には以下のカテゴリのデータ型が含まれます:

  1. 値型

  2. 参照型

  3. ポインタ型

値型

データ型が自分自身のメモリ空間にデータ値を保存する場合、それは値型です。これは、これらのデータ型の変数が値を直接含んでいることを意味します。

すべての値型は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は、何も参照していないことを示します。

空参照型

値型変数はnullにすることができません。なぜなら、それはメモリのアドレスを保存するのではなく、値を保存するからです。C#2バージョン0.0では、nullを割り当てることができる可変型が導入されました。それを使うと、値型変数にnullを割り当てたり、値を割り当てずに値型変数を宣言することができます。