サーチ…


備考

参照型を宣言すると、その初期値はnullになりnull 。これは、まだメモリ内の場所を指していないため、完全に有効な状態です。
ただし、null可能な型を除いて、値の型は通常常に値を持たなければなりません。

使用中の値の型

値の型は単に値を含みます

すべての値の型はSystem.ValueTypeクラスから派生し、これには組み込み型のほとんどが含まれます。

新しい値型を作成するときは、スタックと呼ばれるメモリ領域が使用されます。
スタックは、宣言された型のサイズに応じてそれに応じて増加します。たとえば、intは常にスタック上に32ビットのメモリを割り当てられます。値の型がスコープ内に存在しなくなると、スタック上の領域の割り当てが解除されます。

以下のコードは、新しい変数に代入される値の型を示しています。構造体は、カスタム値型を作成する便利な方法として使用されています(System.ValueTypeクラスは拡張できません)。

理解しておくべき重要なことは、値型を割り当てるときに、値自体が新しい変数にコピーされることです。つまり、オブジェクトに2つの異なるインスタンスがあり、互いに影響を及ぼし得ないということです。

struct PersonAsValueType
{
    public string Name;
}

class Program
{
    static void Main()
    {
        PersonAsValueType personA;

        personA.Name = "Bob";

        var personB = personA;

        personA.Name = "Linda";

        Console.WriteLine(                // Outputs 'False' - because 
            object.ReferenceEquals(       // personA and personB are referencing 
                personA,                  // different areas of memory
                personB));                

        Console.WriteLine(personA.Name);  // Outputs 'Linda'
        Console.WriteLine(personB.Name);  // Outputs 'Bob'
    }
}

使用中の参照型

参照型は、メモリ領域への参照とその領域内に格納されたの両方で構成されます。
これはC / C ++のポインタに似ています。

すべての参照型は、ヒープと呼ばれるものに格納されます
ヒープは、単にオブジェクトが格納されるメモリの管理された領域です。新しいオブジェクトがインスタンス化されると、ヒープの一部がそのオブジェクトによって使用のために割り当てられ、ヒープのその場所への参照が返されます。ヒープはガベージコレクタによって管理され管理され、手動での介入はできません。

インスタンス自体に必要なメモリ領域に加えて、参照自体を格納するための追加領域と、.NET CLRで必要とされる追加の一時的な情報が必要です。

以下のコードは、新しい変数に代入される参照型を示しています。この例では、クラスを使用しています。すべてのクラスは参照型です(静的であっても)。

参照型が別の変数に代入されるとき、それは値そのものではなくコピーされたオブジェクトへの参照です。これは、値タイプと参照タイプの重要な違いです。

これは、同じオブジェクトへの参照が2つあることを意味します。
そのオブジェクト内の値の変更は、両方の変数に反映されます。

class PersonAsReferenceType
{
    public string Name;
}

class Program
{
    static void Main()
    {
        PersonAsReferenceType personA;

        personA = new PersonAsReferenceType { Name = "Bob" };

        var personB = personA;

        personA.Name = "Linda";

        Console.WriteLine(               // Outputs 'True' - because
            object.ReferenceEquals(      // personA and personB are referencing 
                personA,                 // the *same* memory location
                personB));

        Console.WriteLine(personA.Name); // Outputs 'Linda'
        Console.WriteLine(personB.Name); // Outputs 'Linda'
    }


Modified text is an extract of the original Stack Overflow Documentation
ライセンスを受けた CC BY-SA 3.0
所属していない Stack Overflow