ホームページ >バックエンド開発 >C++ >拡張メソッドは最初のパラメータに `ref` 修飾子を使用できますか?

拡張メソッドは最初のパラメータに `ref` 修飾子を使用できますか?

Mary-Kate Olsen
Mary-Kate Olsenオリジナル
2025-01-07 17:02:40735ブラウズ

Can Extension Methods Use the `ref` Modifier for Their First Parameter?

ref 修飾子を使用した拡張メソッド

拡張メソッドでは、最初のパラメーター (通常は this パラメーターと呼ばれます) で ref 修飾子を使用することは禁止されています。主な理由は次のとおりです。

C# 言語の設計原則と互換性がありません:

拡張メソッドは、元の型を変更せずに継承する方法を提供するように設計されています。最初の引数に ref を許可すると、元のインスタンスを直接変更できるため、この原則に違反します。

タイプの安全性に関する潜在的な問題:

最初のパラメーターを通じて値の型 (構造体) を参照によって渡すと、メソッドが静的クラスで宣言されている場合でも、拡張メソッドで元のインスタンスを変更できる可能性があります。これにより、不一致や予期しない動作が発生する可能性があります。

ただし、C# 7.2 以降:

C# 言語仕様が更新され、拡張メソッドの最初の引数に ref を使用できるようになりました。この機能は値の型 (構造体) に限定されており、元のインスタンスの変更が可能です。この機能は参照型 (クラス、インターフェイス、レコード) では機能しないことに注意してください。

例:

次の例は、拡張メソッド内での ref の使用を示しています。

<code class="language-csharp">public struct MyProperties
{
    public string MyValue { get; set; }
}

public static class MyExtensions
{
    public static void ChangeMyValue(this ref MyProperties myProperties)
    {
        myProperties.MyValue = "来自MyExtensions的问候";
    }
}

public class MyClass
{
    public MyClass()
    {
        MyProperties myProperties = new MyProperties();
        myProperties.MyValue = "你好,世界";
        myProperties.ChangeMyValue(); //调用扩展方法修改值
    }
}</code>
この例では、

拡張メソッドは、値型である元の ChangeMyValue インスタンスの MyProperties プロパティを変更します。 MyValue を使用すると、メソッドはインスタンスに直接アクセスし、その状態を変更できます。 ref

以上が拡張メソッドは最初のパラメータに `ref` 修飾子を使用できますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。