参照型に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さんにアドレス帳の内容をコピーして渡したら、住所録に書いてあった住所の家に落書きされていた。

といった感じである。