参照型にrefキーワードがついている時とついていない時の違い

メソッドを定義するときに、refキーワードを参照型に付けたときと付けなかったときの違いは、簡単に言えば・・・

・ref付きは参照する場所を変更出来る。

・ref無しは参照する場所を変更出来ない。

・両方とも、参照先のオブジェクトが持った値を変更する事は可能。

である。

例をあげれば・・・

001         private void button1_Click(object sender, System.EventArgs e)
002         {
003             testClass a = new testClass();
004             a.VAL = "test";
005             test(ref a);
006             //"testdayo2"が表示される。
007             MessageBox.Show(a.VAL);
008             test2(a);
009             //"testdaro"が表示される。
010             MessageBox.Show(a.VAL);
011         }
012 
013         //変数そのものが渡される。
014         private void test(ref testClass val)
015         {
016             //変数の中にあるプロパティの変更は反映される。
017             val.VAL = "testdayo";
018             //参照の変更も反映される。
019             val = new testClass();
020             val.VAL = "testdayo2";
021         }
022         //変数のコピーが渡される。
023         private void test2(testClass val)
024         {
025             //変数のこぴーであっても、参照先は同じなので
026             //変数の中にあるプロパティの変更は反映される。
027             val.VAL = "testdaro";
028             //参照の変更は関数内でのみ反映される。
029             //なぜなら変数のコピーでしかないから。
030             val = new testClass();
031             val.VAL = "testdakedo";
032         }
033     }
034 
035     public class testClass
036     {
037         private string _val;
038         public string VAL
039         {
040             get
041             {
042                 return _val;
043             }
044             set
045             {
046                 _val =value;
047             }
048         }
049     }
050 

という事である。

動作を何かに例えるならば、

ref付き引数のメソッドをAさんとすると・・・

・Aさんに住所録渡したら、住所録に書いてあった住所の家に落書きされていた。

また、住所録を返して貰ったら住所録の中身が変わっていた。

ref無し引数のメソッドをBさんとすると・・・

・Bさんにアドレス帳の内容をコピーして渡したら、住所録に書いてあった住所の家に落書きされていた。

といった感じである。

Share