4

拡張メソッドがどのように機能するかを理解したいですか?非静的クラスで拡張メソッドを定義できますか?

*

なぜ静的クラス内に拡張メソッドを配置するのですか?

*

MSDNによると、

**最初のパラメーターは、メソッドが操作する型を指定し、パラメーターの前に this 修飾子が続きます。拡張メソッドは、using ディレクティブを使用して名前空間をソース コードに明示的にインポートする場合にのみ有効です。

**

ここでのこの演算子の役割は何ですか?また、その拡張メソッドをその引数にどのように関連付けますか?

4

4 に答える 4

7

いいえ、静的でないクラスで拡張メソッドを定義することはできません。

this、インスタンスで静的拡張メソッドを呼び出すことを可能にする構文糖衣です。しかし、結局のところ、拡張メソッドは静的クラスの静的メソッドにすぎません。

だから基本的に:

var test = myInstance.MyExtensionMethod();

と同じです

var test = MyExtensionClass.MyExtensionMethod(myInstance);
于 2013-04-12T08:16:12.447 に答える
2

これらは、メソッドが拡張メソッドになるための 4 つの要件です。

  • 静的クラスで宣言する必要があります
  • 静的でなければなりません (最初の条件が満たされた場合、これは実際には常に true です)。
  • 公開する必要があります
  • thisキーワードでマークされた最初のパラメーターが必要です

したがって、非静的クラスで拡張メソッドを定義することはできません。

拡張メソッド全体の機能は、ある種のシンタックス シュガーです。で宣言されている次の拡張メソッドMyClass:

// The following extension methods can be accessed by instances of any  
// class that is or inherits MyClass. 
public static class Extension
{
    public static void MethodA(this MyClass myInterface, int i)
    {
        Console.WriteLine
            ("Extension.MethodA(this IMyInterface myInterface, int i)");
    }
}

次の 2 つの方法で呼び出すことができます。

var myClassObject = new MyClass();

Extension.MethodA(myClassObject);

または

myClassObject.MethodA();

ただし、いずれにせよ、2 番目のものはコンパイラによって最初のものに変換されます。

于 2013-04-12T08:22:10.860 に答える
1

いいえ、拡張メソッドは静的クラスにある必要があります。それが単なるルールです。拡張メソッドをどこでも定義できるようにすることは可能でしたが、見つけやすくするために、多くの他のコードを含むクラス内に埋め込むことは許可されていません。

thisキーワードは、拡張メソッドであることを指定するために、拡張メソッドの最初のパラメーターで使用されます。

(通常のメソッドの内部実装にも、最初のパラメーターとしてオブジェクトへの参照があるため、コンパイラーが拡張メソッドに対して行うことは、それらをクラス内の他のメソッドに追加することだけです。)

于 2013-04-12T08:24:30.677 に答える