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 サイトの他の関連記事を参照してください。