• ベストアンサー

c# でoutとrefの機能以外の違い

 こんにちはc#初心者です。  メソッドに値を渡す時に「outキーワード」と「refキーワード」が使えますが、これらは書き込み専用と、読み書き両用の機能差以外にデータの渡し方などの差はあるのでしょうか?    intを渡したときの時間を比較してみましたが、差は0.5%未満、誤差の範囲内でした。  差がないのなら余計な心配なのですが、どなたか詳しい方がいらっしゃいましたら教えてください。

質問者が選んだベストアンサー

  • ベストアンサー
  • D-Matsu
  • ベストアンサー率45% (1080/2394)
回答No.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は「メソッドから出力を受け取る」であるという違いはありますが、やってることは殆ど一緒です。

koumei000
質問者

お礼

そうなのですね。勉強になりました。ありがとうございます。

その他の回答 (2)

  • oboroxx
  • ベストアンサー率40% (317/792)
回答No.2

推測もありますが、受け渡し方はどちらも参照受け渡しです。 outがついたものは、その変数が渡される前に値が設定されていなくても、コンパイルの時に警告などの表示はないですが、 refに関しては、その関数の中で値が使用されようがされまいが、受け渡す前に値が設定されていなければ警告などがコンパイルの時に表示されます。 以上のことから、主に開発者がバグを発見しやすくするためのキーワードと思っております。 また、その関数を再利用する人から見ると、refなら値を設定しないといけないと思い、outなら特に気にする必要がないのだなということが見ただけで読み取れるので便利かなと思います。

koumei000
質問者

お礼

なるほど、確かにそれは便利です。

  • axsies
  • ベストアンサー率64% (38/59)
回答No.1

int add(int x, int y) {  return x + y; } メソッドに値型を渡す場合、通常は値渡しになります。 上記addメソッドの仮引数x, yには呼び出したときに値がコピーされて渡されるということです。 引数にrefキーワードを付けると、参照渡しになり、このコピーが回避できます。 int型では差はでないと思いますが、巨大な構造体を頻繁にメソッドに渡さなければならない場合は差がでるはずです。(C#の構造体は値型です) ただC#では、こうした値渡しのコピーを回避する目的で参照渡しにする、というのはあまり見たことがないです。

koumei000
質問者

補足

……あの、質問は「outキーワード」と「refキーワード」の違いについてなのですが……。

関連するQ&A