- ひろし
- ぬし
- 会議室デビュー日: 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
ご返答ありがとうございました。
理解できました。
|