- ベストアンサー
c# でoutとrefの機能以外の違い
こんにちはc#初心者です。 メソッドに値を渡す時に「outキーワード」と「refキーワード」が使えますが、これらは書き込み専用と、読み書き両用の機能差以外にデータの渡し方などの差はあるのでしょうか? intを渡したときの時間を比較してみましたが、差は0.5%未満、誤差の範囲内でした。 差がないのなら余計な心配なのですが、どなたか詳しい方がいらっしゃいましたら教えてください。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
以下にoutとrefそれぞれの解説がありますが、「コンパイル時には同等に扱われる」と明記されています。ですから差は無いと思っていいのではないかと。 http://msdn.microsoft.com/ja-jp/library/14akc2c7(v=vs.80).aspx http://msdn.microsoft.com/ja-jp/library/t3c3bfhx(v=vs.80).aspx 一応キーワードの意味づけとしてはrefが「参照をメソッドに渡す」であるのに対してoutは「メソッドから出力を受け取る」であるという違いはありますが、やってることは殆ど一緒です。
その他の回答 (2)
- oboroxx
- ベストアンサー率40% (317/792)
推測もありますが、受け渡し方はどちらも参照受け渡しです。 outがついたものは、その変数が渡される前に値が設定されていなくても、コンパイルの時に警告などの表示はないですが、 refに関しては、その関数の中で値が使用されようがされまいが、受け渡す前に値が設定されていなければ警告などがコンパイルの時に表示されます。 以上のことから、主に開発者がバグを発見しやすくするためのキーワードと思っております。 また、その関数を再利用する人から見ると、refなら値を設定しないといけないと思い、outなら特に気にする必要がないのだなということが見ただけで読み取れるので便利かなと思います。
お礼
なるほど、確かにそれは便利です。
- axsies
- ベストアンサー率64% (38/59)
int add(int x, int y) { return x + y; } メソッドに値型を渡す場合、通常は値渡しになります。 上記addメソッドの仮引数x, yには呼び出したときに値がコピーされて渡されるということです。 引数にrefキーワードを付けると、参照渡しになり、このコピーが回避できます。 int型では差はでないと思いますが、巨大な構造体を頻繁にメソッドに渡さなければならない場合は差がでるはずです。(C#の構造体は値型です) ただC#では、こうした値渡しのコピーを回避する目的で参照渡しにする、というのはあまり見たことがないです。
補足
……あの、質問は「outキーワード」と「refキーワード」の違いについてなのですが……。
お礼
そうなのですね。勉強になりました。ありがとうございます。