2006.12.28

オブジェクト型の値渡し

メソッドへの引数の渡し方の一つに値渡しがあります。
値渡しでは呼び出し先のメソッドの内部で、その引数に変更を加えても、
呼び出し元の値には変更は起こりません。

ですが、オブジェクト型の変数(例えば、HashMapや配列)では
呼び出し先のメソッドで、格納されている値を変更することで、
呼び出し元の値まで変更されてしまいます。

//ClassAの定義
Public class ClassA {
   private string s1;
}

ClassA A = new ClassA(); //クラスのインスタンス化
A.s1 = "あ";

Hoge(A); //メソッドを呼び出す

Public void Hoge( ClassA A1 ) {
   A1.s1 = "い";
}

このような場合、Hoge(A)を呼び出した後に、
A.s1の値はどうなっているのでしょうか?
値渡しなので、関数実行後でもA.s1は"あ"かと思いますが、答えは"い"です。
これは、値渡しでは渡されたオブジェクトのアドレスはコピーされ渡されますが、
そのオブジェクに格納されている変数の参照先はコピーされず渡されるため、
呼び出し元の値と同じアドレスを参照しているからです。

オブジェクト型の扱いには注意しましょう。

コメントを投稿

(いままで、ここでコメントしたことがないときは、コメントを表示する前にこのブログのオーナーの承認が必要になることがあります。承認されるまではコメントは表示されません。そのときはしばらく待ってください。)

photo
osano