変数が値で返される方法と、参照によって最も高いパフォーマンスを持つ方法の2つがある場合は、値または参照で返されますか?
myObj.Method1(out var);
または
var = myObj.Method2();
私は、最初のバージョンを推測する方が効率的ですが、それはあなたが常に参照値を返すメソッドを構築する必要があります意味ですか?あるいは、変数を値で返す理由がありますか?
ありがとうございました。
変数が値で返される方法と、参照によって最も高いパフォーマンスを持つ方法の2つがある場合は、値または参照で返されますか?
myObj.Method1(out var);
または
var = myObj.Method2();
私は、最初のバージョンを推測する方が効率的ですが、それはあなたが常に参照値を返すメソッドを構築する必要があります意味ですか?あるいは、変数を値で返す理由がありますか?
ありがとうございました。
パフォーマンスの差異は計り知れないほど小さいか存在しません。
2つのバージョンが異なるセマンティクスを持つと誤って想定しています。
参照型の場合、両方のメソッドが参照を1回だけコピーします。
大きな値の型の場合は、別の一時的なローカルを必要としないので、out
パラメータを高速化できます。
結論にジャンプする前に常に測定してください!
2つの値を返す必要がない限り、out
パラメータは使用しないでください。
リファレンスタイプであれば、パフォーマンスの差はまったくありません。
ちなみに、値を返すようにメソッドを定義すると、ではなく、が値になります。戻り値の型は、型が値型でない限り、常に参照によるものです。
参照型(クラス)は、どちらの場合も値が参照によって返されるため、ほとんど違いはありません。
値型(structs)の場合、型に多くのフィールドが含まれていると、その場合にout
パラメータを使用した戻り値が少し速くなる場合があります。
しかし、私がXNAで作業していて、行列型を返さなければならない場合は、最初のフォームを使用する方が良いでしょうか? – Puyover
最初の形式(out var)は、基本的には*一般的な規則*の例外です:*あなたのメソッド*がデータを呼び出し元に与えるとき、1つ以上のパラメータを返さなければならないまで、常に戻り値になります。また、* out *は、CLSとの互換性を持たないため、好きではありません。 CLRの新しい言語は、この形式のパラメータリターンをサポートしない可能性があります。私はCLSに関する私の記述が正しいかどうかを確認しています... –
基本的には、2つの戻り値がある場合には、最初の形式を使用する必要があります。 – Puyover