演習 - 参照型

参照型には、配列、クラス、および文字列が含まれます。 参照型は、アプリケーションの実行時に値が格納される方法に関して、値の型とは異なる方法で処理されます。

この演習では、参照型と値の型との違いについて学習するほか、new 演算子を使用して、コンピューターのメモリ内の値に変数を関連付ける方法についても学習します。

参照型と値の型との違い

値の型の変数では、その値は スタック というストレージの領域に直接格納されます。 スタックとは、CPU で現在実行されているコードに割り当てられているメモリです (スタック フレームまたはアクティブ化フレームとも呼ばれます)。 スタック フレームで実行が完了すると、スタック内の値は削除されます。

参照型の変数では、その値は ヒープ と呼ばれる個別のメモリ領域に格納されます。 ヒープとは、オペレーティング システム上で同時に実行されている多数のアプリケーション間で共有されるメモリ領域です。 .NET ランタイムでは、オペレーティング システムと通信して、使用可能なメモリ アドレスを特定し、値を格納できるアドレスを要求します。 .NET ランタイムでは、値を格納してから、メモリ アドレスをその変数に返します。 ご利用のコードでこの変数が使用される場合、.NET ランタイムによって、変数に格納されたアドレスがシームレスに検索され、そこに格納されている値が取得されます。

これらのアイデアをより明確に示すコードを作成してみましょう。

ステップ 1 - 前の演習のコードを削除またはコメント アウトする

前の演習のコードを選択し、Backspace キーまたは del キーを選択します。 必要に応じて、.NET エディター内で前のコードをコメント アウトします。

ステップ 2 - 参照型の変数を定義する

次のコードでは、int 型の配列の値を保持できる変数が定義されています。

int[] data;

この時点で、data は、参照 (もっと厳密には値のメモリ アドレス) をヒープ内に格納することが可能な単なる変数です。 これはメモリ アドレスを指していないため、"null 参照" と呼ばれます。

ステップ 3 - new キーワードを使用して int 配列のインスタンスを作成する

次のコードを使用して int 配列の新しいインスタンスを作成して割り当てるように、ステップ 2 のコードを変更します。

int[] data;
data = new int[3];

new キーワードは、.NET ランタイムに int 配列のインスタンスを作成してから、それをメモリに格納するためにオペレーティング システムと調整するように指示します。 .NET ランタイムは、新しい int 配列のメモリ アドレスをコンパイルして返します。 最後に、メモリ アドレスは変数データに格納されます。 int 配列の要素の既定は、int の既定値である値 0 です。

ステップ 4 - 1 行のコードで、両方の操作を実行できるようにコードの例を変更する

通常は、ステップ 3 の 2 行から成るコードを 1 行のコードに短縮して、変数の宣言と、int 配列の新しいインスタンスの作成の両方が行われます。 ステップ 3 のコードを、次のように変更します。

int[] data = new int[3];

出力はありませんが、この演習により、参照型を操作するプロセスの手順に C# 構文がどのように関連しているかを明確にできました。

C# の文字列データ型が異なるのはなぜですか?

string データ型も参照型です。 文字列を宣言するときに、なぜ new 演算子を使用しないのか疑問に思うかもしれません。 これは純粋に、C# の設計者によってもたらされた利便性です。 string データ型は非常に頻繁に使用されるため、次の形式を使用できます。

string shortenedString = "Hello World!";
Console.WriteLine(shortenedString);

ただし、背後では、System.String の新しいインスタンスが作成され、"Hello World!" に初期化されます。

注意

言語デザイナーは "糖衣構文" と呼ばれるシンプルなショートカットを作成する場合があります。 このフレーズは、記事、ビデオ、プレゼンテーションでよく目にするものです。

まとめ

  • 値の型ではより小さい値を保持することができます。値の型はスタックに格納されます。 参照型では大きな値を保持できます。参照型の新しいインスタンスは、new 演算子を使用して作成されます。 参照型の変数では、ヒープに格納されている実際の値への参照 (メモリ アドレス) が保持されます。
  • 参照型には、配列、文字列、およびクラスが含まれます。