明示的なrefパラメータが機能的な観点から有用であるケースはごくわずかです。私が見てきた
一例:
public static void Swap<T>(ref T a, ref T b)
{
var temp = a;
a = b;
b = temp;
}
このような方法は、例えば、いくつかの並べ替えアルゴリズムに有用です。
refパラメータが使用されることがある理由の1つが最適化手法です。構造体の内容のコピーを避けるために、呼び出されたメソッドが構造体の値を変更する意図がなくても、大きな構造体(値型)がrefによって渡されることがあります。大きな構造体はクラス(つまり参照型)である方がよいと主張することができますが、そのようなオブジェクトの大規模な配列を保持すると(グラフィックス処理など)、欠点があります。最適化されているため、コードの可読性は向上しませんが、状況によってはパフォーマンスが向上します。
ポインタについても同様の質問があります。 C#はunsafe
とfixed
のキーワードを使用してポインタをサポートしています。機能的な観点からはほとんど必要とされていません。私は、ポインタを使わなければコード化できなかった機能については本当に考えることができません。しかし、ポインターは、表現力豊かな言語やコードを読みやすくするために使用されるものではなく、低レベルの最適化手法として使用されます。
実際、参照によって構造体を渡すことは、大きな構造体の一般的な低レベルの最適化手法である構造体のデータへのポインタを渡す安全な方法です。
レガシー機能を低レベルで最適化できる機能はありますか?それはあなたの視点に依存するかもしれませんが、唯一のC#ユーザーではありません。彼らの多くは、ポインタやその他の低レベルの構造体が利用できることは、C#が他の言語よりも大きなメリットの1つであることを伝えます。私はrefパラメータがレガシーなフィーチャであるとは考えていませんが、それらは言語の不可欠な部分であり、いくつかのシナリオでは便利です。
には、LINQ、async/awaitなどの言語機能を使用する必要がないのと同じように、にrefパラメータを使用する必要はありません。あなたがそれを必要とするときには、それがそこにあることを喜んでください。
1つではなく2つ以上の(値型)変数の値を調整する必要がある関数を定義した場合はどうなりますか? – Adimeus
この例は実際にはっきりとしています。 'ref'がどのように動作し、どのように使用するのかを正確に示しています。しかし、私は正直なところ、他のものよりも 'ref 'を使う状況を考えることができないので、私はいくつかの答えも見たいと思います。 –
呼び出された関数を使って2つの変数を更新したいのですが?この場合、refは2つの変数をrefとマークすることで役立ちます。 – DarkKnight