- PR -

メソッドのref記述 (C#)

1
投稿者投稿内容
ひろし
ぬし
会議室デビュー日: 2002/09/16
投稿数: 390
お住まい・勤務地: 兵庫県
投稿日時: 2004-07-14 12:53
C#についての基本的な質問ですが、
メソッドにおいてstring、object等の参照型変数のパラメータに対し、
refを記述した場合、ref無しの場合に何らかの違いが発生しますか?
両者は論理的に等価と考えてOKでしょうか?
また、(わずかかも知れませんが)実行効率が落ちるのでしょうか?


1aと1bの違いは?
(1a) public void test(object obj){…}
  ↓
(1b) public void test(ref object obj){…}
2aと2bの違いは?
(2a) public void test(string str){…}
  ↓
(2b) public void test(ref string str){…}
NAL-6295
ぬし
会議室デビュー日: 2003/01/26
投稿数: 966
お住まい・勤務地: 東京
投稿日時: 2004-07-14 13:08
等価じゃ無いですよ。

簡単にいえば、
引用:

1a) public void test(object obj){…}


は、指し示しているオブジェクトの値を変更することができる。

引用:

(1b) public void test(ref object obj){…}


は、指し示しているオブジェクト自体を変更することができる。

という違いがあります。
詳しくはリファレンスを呼んでください。

追記:
参考例
コード:

private void button1_Click(object sender, System.EventArgs e)
{
testClass a = new testClass();
a.VAL = "test";
test(ref a);
//"testdayo2"が表示される。
MessageBox.Show(a.VAL);
test2(a);
//"testdaro"が表示される。
MessageBox.Show(a.VAL);
}

//変数そのものが渡される。
private void test(ref testClass val)
{
//変数の中にあるプロパティの変更は反映される。
val.VAL = "testdayo";
//参照の変更も反映される。
val = new testClass();
val.VAL = "testdayo2";
}
//変数のコピーが渡される。
private void test2(testClass val)
{
//変数のこぴーであっても、参照先は同じなので
//変数の中にあるプロパティの変更は反映される。
val.VAL = "testdaro";
//参照の変更は関数内でのみ反映される。
//なぜなら変数のコピーでしかないから。
val = new testClass();
val.VAL = "testdakedo";
}
}

public class testClass
{
private string _val;
public string VAL
{
get
{
return _val;
}
set
{
_val =value;
}
}
}



[ メッセージ編集済み 編集者: NAL-6295 編集日時 2004-07-14 13:35 ]
ぢゃん♪
大ベテラン
会議室デビュー日: 2003/06/12
投稿数: 208
お住まい・勤務地: 都内
投稿日時: 2004-07-14 13:15
引用:

ひろしさんの書き込み (2004-07-14 12:53) より:
C#についての基本的な質問ですが、
メソッドにおいてstring、object等の参照型変数のパラメータに対し、
refを記述した場合、ref無しの場合に何らかの違いが発生しますか?
両者は論理的に等価と考えてOKでしょうか?
また、(わずかかも知れませんが)実行効率が落ちるのでしょうか?


等価ではありません。VBでいうByRefです。
(それと、たしか記憶ではC++での「&」もそういう機能を持っていたような気がします。)
コード:

public void test1(string str){
str = "ほげほげ";
}
public void test2(ref string str){
str = "HOGEHOGE";
}


に対して、それぞれ呼び出し結果が変わります。
コード:

string str = "ABC";
XXX.test1(str); // → strは "ABC"のまま
XXX.test2(ref str); // → strが "HOGEHOGE" に置き換わる


でも、こういうのはソースの意味を読み取りにくくして要注意なので、わざわざrefキーワードをつけないといけないようにしているのでしょう。

[ メッセージ編集済み 編集者: ぢゃん♪ 編集日時 2004-07-14 13:19 ]
ひろし
ぬし
会議室デビュー日: 2002/09/16
投稿数: 390
お住まい・勤務地: 兵庫県
投稿日時: 2004-07-15 01:55
ご返答ありがとうございました。
理解できました。
1

スキルアップ/キャリアアップ(JOB@IT)