ホームページ > バックエンド開発 > C++ > C# 拡張メソッド (C# 7.2 より前) で「ref」を「this」パラメーターと一緒に使用できないのはなぜですか?

C# 拡張メソッド (C# 7.2 より前) で「ref」を「this」パラメーターと一緒に使用できないのはなぜですか?

Patricia Arquette
リリース: 2025-01-07 16:41:43
オリジナル
311 人が閲覧しました

Why Can't

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

の制限事項

refthis パラメータに適用すると、次の制限が発生します:

<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 では、この制限に対処しました。 refthis パラメーターと一緒に使用できるようになりました。これは、値の型 (構造体) を変更する場合に特に有益です。

実際の応用: 構造体の変更

この機能は、構造体を操作する場合に非常に価値があり、拡張メソッド内でのインプレース変更が可能になります。 例:

<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>
ログイン後にコピー

ここで、UpdateValueValue 構造体の MyData プロパティを直接変更します。 これにより、新しい構造体インスタンスの作成が回避され、パフォーマンスが向上します。

以上がC# 拡張メソッド (C# 7.2 より前) で「ref」を「this」パラメーターと一緒に使用できないのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート