C# 拡張メソッドと "ref" 修飾子: "this" パラメーターのニュアンスを理解する
C# 拡張メソッドは、元のコードを変更することなく、新しい機能で既存の型を強化します。 ただし、ref
修飾子を this
パラメーターとともに使用する場合、特に拡張されるインスタンスに与える影響に関して、重要な違いが生じます。
ref
拡張メソッドの引数内の修飾子
拡張メソッドは、ref
によって変更された引数を受け入れることができ、元の値を変更できます。 以下を考慮してください:
<code class="language-csharp">public static void Modify(ref int x, int y) { x = y; }</code>
ref
は通常のパラメータを変更するため、これは有効です。
ref this
ref
を this
パラメータに適用すると、次の制限が発生します:
<code class="language-csharp">public static void ModifyExtension(this ref int x, int y) { x = y; } //Compiler Error</code>
これによりコンパイラ エラーが生成されます。
歴史的コンテキスト (C# 7.2 以前)
C# 7.2 より前では、この制限はコンパイラの制約に起因していました。コンパイラーは this
パラメーターを別の方法で処理し、ref
セマンティクスを妨げました。
C# 7.2 以降: ref this
C# 7.2 では、この制限に対処しました。 ref
を this
パラメーターと一緒に使用できるようになりました。これは、値の型 (構造体) を変更する場合に特に有益です。
実際の応用: 構造体の変更
この機能は、構造体を操作する場合に非常に価値があり、拡張メソッド内でのインプレース変更が可能になります。 例:
<code class="language-csharp">public struct MyData { public string Value { get; set; } } public static class MyDataExtensions { public static void UpdateValue(this ref MyData data, string newValue) { data.Value = newValue; } }</code>
ここで、UpdateValue
は Value
構造体の MyData
プロパティを直接変更します。 これにより、新しい構造体インスタンスの作成が回避され、パフォーマンスが向上します。
以上がC# 拡張メソッド (C# 7.2 より前) で「ref」を「this」パラメーターと一緒に使用できないのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。