次のコード スニペットを検討してください
Form form2 = new Form();
test(form2);
form2.Show();
public void test(Form f)
{
f = null;
}
f は Form2 への「別の」参照も保持するため、f を null に設定すると、Form2 も null に設定されますが、そうではありません。これを理解するには、適切な説明が必要です。
に設定された参照null
は、参照のローカル コピーですform2
。参照は値によって渡されるため、正確なコピーを作成してコピーを渡すため、元のファイルは変更されません。
ここで渡される値は、メモリ アドレスと見なすことができます (これは VM の場合とは異なりますが、有用で適切な比喩です)。
テスト メソッドでは、このアドレスのコピーを保持する変数を に設定しますnull
。これにより、それ以上の影響はありません。
変数に格納されたアドレスを使用して、アドレスが参照する実際のオブジェクトにアクセスして変更する場合は、状況が大きく異なります。ここでは実際のものを変更しているため、ローカル変数がスコープを超えた後もすべての変更が残ります。
もう一歩戻るには:
変数は、友人 (オブジェクト) のアドレスが書かれた一枚の紙として見ることができます。紙を燃やした場合 (変数を null に設定)、友人は影響を受けません。紙を使って住所を訪問し、友人にプレゼントを贈ったり、顔を平手打ちしたり (変数の背後にあるオブジェクトのメソッドを呼び出します) した場合、友人は間違いなく影響を受け、その結果を受け入れなければなりません。
(私はこれがJavaであると仮定しています。)
メソッドのパラメーターは常に値で渡されます。つまり、その内容は常に新しい変数にコピーされます。この場合、f
オブジェクトへの参照を含む variable の内容が新しい変数にコピーされます。その新しい変数の内容が に置き換えられてnull
も、元の変数の内容は影響を受けず、元のオブジェクトを指し続けます。