■78848 / inTopicNo.6) |
Re[3]: 参照型の値渡しについて |
□投稿者/ WebSurfer (831回)-(2016/02/21(Sun) 13:01:34)
|
■No78846 (DD さん) に返信
参考にされている MSDN ライブラリの中には、
> 参照型を値渡しした場合、オブジェクト自体の参照は書き換えられないが、プロパティの値を変更すると、 > 呼び出し元のプロパティは更新されると記載がありました。
という記述は見つけられませんでした・・・が、要するにメソッドの引数として ref を付け る/付けないで何が違うのかという話と理解してレスします。
ref を付ける/付けないの話の前に、(1) 値型と参照型の違い、(2) 変数のスコープ、(3) 引数 を渡す仕組み、が理解できていないとなかなか話が通じにくいのですが、そのあたりは問題ない でしょうか?
ちょっと不安ということであれば、(1) については以下の記事を一読してください。面倒であれ ば「図 2-1 値型変数と参照型変数の値の代入」だけでも見れば理解が深まると思います。
2-3 値型と参照型 https://msdn.microsoft.com/ja-jp/library/cc406735.aspx
(2) と (3) については、質問者さんが参考にされている後者の記事(URL 下記)のコードを例 に説明してみます。
参照型のパラメーターの引き渡し (C# プログラミング ガイド) https://msdn.microsoft.com/ja-jp/library/s6938f28.aspx
Change メソッドの引数 pArray は int 型配列のオブジェクトの実体ではなく、オブジェクトが メモリ上のどこにあるかを指すポインタのようなもの(「図 2-1 値型変数と参照型変数の値の 代入」で言うと nnnn という値を保持する変数 s に相当)という理解はよろしいですか?
それは「値による参照型の引き渡し」のコード(ref を付けない方)の Change メソッドでも、 「参照による参照型の引き渡し」のコード(ref を付けた方)の Change メソッドでも同じこと です。
で、ref が付く/付かないで何が違うのかというと、
・ref を付けない方:Main で Change(arr) が呼び出される際、変数 arr の値が変数 pArray にコピーされる。変数 arr と変数 pArray は別物でスコープはそれぞれ Main メソッド、 Change メソッド内に限られる。
ただし、渡した時点では同じオブジェクトを指しているので pArray を操作してオブジェクト の中身を書き換える(コードでは pArray[0] = 888;)ことができる。
pArray = new int[5] {-3, -1, -2, -3, -4}; とすると新たにオブジェクトが作られそれへの ポインタが pArray に代入される。Main メソッドの変数 arr が指すオブジェクトは変わらな い。なので、変数 arr と変数 pArray が指すオブジェクトは別ものになる。
・ref を付けた方:変数 arr と変数 pArray は同じものになる。上と違って、コピーではなく、 入れ物自体が同じになる。
なので、Change メソッドで pArray = new int[5] {-3, -1, -2, -3, -4}; とすると Main メ ソッドの変数 arr も同じオブジェクトを指すようになる。
ということになります。
なので、
> 参照型を値渡しした場合、オブジェクト自体の参照は書き換えられないが、プロパティの値を変更すると、 > 呼び出し元のプロパティは更新されると記載がありました。
というのはちょっと理解が違うのではないかと思います。また、
> 実際プログラムを記載する上で、渡されたオブジェクトのプロパティを更新するような > 使い方をする場面があるでしょうか?
は普通に行うことで、ref が付く/付かないには直接関係ない話だと思います。
|
|