C# 拡張メソッドの ref 修飾子と out 修飾子
参照型を拡張する拡張メソッドでは、最初のパラメーターで ref
または out
修飾子を使用できません。ただし、C# 7.2 以降では、拡張値型 (構造体) の拡張メソッドの最初のパラメーターに ref
修飾子を追加できるようになりました。
この制限の理由は、拡張メソッドの最初のパラメーターが、拡張されるインスタンスを表す受信側パラメーターと見なされるためです。参照型の場合、受信側パラメーターは常に参照によって渡されるため、ref
または out
修飾子の使用は冗長です。
ただし、値型の場合、受信側パラメーターは値によって渡されます。つまり、拡張メソッドで加えられた変更は、元の値型インスタンスには反映されません。 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 = "hello from MyExtensions"; } } public class MyClass { public MyClass() { MyProperties myProperties = new MyProperties(); myProperties.MyValue = "hello world"; myProperties.ChangeMyValue(); // Now modifies the original myProperties instance } }</code>
この例では、ChangeMyValue
拡張メソッドは、ref
修飾子を使用して MyProperties
値型インスタンスの状態を変更できます。 out
修飾子は拡張メソッドの最初のパラメーターでは引き続き使用できないことに注意してください。
以上がRef 修飾子と Out 修飾子は C# 拡張メソッドで使用できますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。