変数はオブジェクトではなく、オブジェクトへの参照にすぎません。したがって、たとえば、次の例では、両方が同じオブジェクトを参照する2つの変数があります。
Label label1 = new Label();
Label label2 = label1;
label1.Text = "1";
label2.Text = "2";
そのコードを実行するとlabel1.Text
、「1」ではなく「2」に等しいことがわかります。これは、両方が同じLabel
オブジェクトを参照しているためです。したがって、を設定label2.Text
すると、両方の変数で変更されます。ただし、2つの別々のラベルオブジェクトをインスタンス化した場合、結果は異なります。たとえば、次のようになります。
Label label1 = new Label();
Label label2 = new Label();
label1.Text = "1";
label2.Text = "2";
Label
この2番目の例では、各変数が異なるオブジェクト(つまり、Labelクラスの異なるインスタンス)を指しています。したがって、このコードを実行した後は、予想どおり、label1.Text
「1」に等しく、「2」に等しくなります。label2.Text
これらのオプションの両方が重要であり、利用できるのには十分な理由があります。たとえば、のText
プロパティを設定するメソッドを作成するとします。たとえば、次のようになりLabel
ます。
void SetLabelText(Label labelToSet)
{
labelToSet.Text = "text";
}
そして、あなたはこのようなメソッドを呼び出すことができます:
Label label1 = new Label();
SetLabelText(label1);
この場合、メソッドlabelToSet
内の変数は変数SetLabelText
と同じオブジェクトを参照するlabel1
ため、'が"text"にSetLabelText
設定されると、新しいものは作成されず、パラメーターとして渡された既存のオブジェクトにテキストが設定されるだけです。メソッド、まさにあなたが起こりたいことです。labelToSet.Text
Label
Label
どの変数も新しいオブジェクトまたは既存のオブジェクトのいずれかに設定できるため、オブジェクトに割り当てられるまでは「null」と見なされます。最初に言ったように、変数はオブジェクトではなく、オブジェクトへの参照にすぎません。変数がオブジェクトをまったく参照していない場合(初期状態)、それnull
を使用しようとすると例外がスローされます。例えば:
Label label1;
label1.Text = "1"; // Throws a null reference exception
必要な数の変数を宣言できますが、null
実際に少なくとも1つのオブジェクトをインスタンス化してそれに設定するまで、すべての変数が宣言されます。オブジェクトをインスタンス化するには(つまり、クラスの新しいインスタンスを作成するには)、new
キーワード(eg new Label()
)を使用する必要があります。
ただし、これまでに述べたことはすべて、「参照型」(クラス)にのみ当てはまります。これは「値型」(構造体)には当てはまりません。変数を値型として宣言する場合、すべての実用的な目的で、それは実際にはオブジェクトです。のような多くの単純なデータ型int
は値型です。たとえば、次のようになります。
int x;
int y;
x = 1;
y = x;
y = 2;
上記のコードを実行した後、x
は等しく1
なり、y
等しくなります2
。設定しても、と同じオブジェクトを参照するy = x
ことはありません。むしろ、からに値をコピーし、それによって新しい値型オブジェクトを作成します。y
x
x
y