0

メソッドが拡張メソッドであるかどうかを判断する方法については、完全にはわかりません。次のガイドラインを読みました。

  1. メソッドは、静的クラス ("IntExtensions" など) にある必要があります。

  2. メソッドは「public static」である必要があります(例public static int Half(this int source)

拡張メソッドに関する私の問題は次のとおりです。

  1. メソッドがどのクラスを拡張しているかを知る方法がわかりません。その前にあるクラスthisですか?上記の例では、文字列になりますか?
  2. メソッドを囲む静的クラスはどのような役割を果たしますか? 全体の構文は非常に紛らわしいようです。
  3. 同じクラスの下にあるさまざまなクラスのさまざまな拡張メソッドをグループ化できませんでしたか (1 つのクラスだけを拡張したいので意味がないようです)。たとえば、次のようになります。

/

public static class IntExtensions 
{
    // method has to be static, first parameter is tagged with the 'this'
    // keyword, the type of the parameter is the type that is extended.
    public static int Half(this int source) 
    {
        return source / 2;
    }

    public static string foo( this string s)
    {
        //some code
    }
}
4

4 に答える 4

9
  1. thisこれはメソッドが実行されるオブジェクトのインスタンスであるため、拡張メソッドが拡張している型はシグネチャのキーワードの直後にあります。

  2. 拡張メソッドを呼び出すクラスのインスタンスがないため、拡張メソッドは静的でなければなりません (代わりにインスタンスが渡されます)。静的クラスを使用すると、すべてのメソッドも静的になります。

  3. はい、できます。おっしゃる通りですが、あまり意味がありません。クラスのコンシューマーは、単一の型に関連するメソッドではなく、すべての型のすべての拡張メソッドに公開されます (これが、通常、拡張メソッド クラスを操作対象の型ごとに編成する理由です)。

于 2013-10-16T15:21:24.513 に答える
5

メソッドがどのクラスを拡張しているかを知る方法がわかりません。その前にあるクラスthisですか?

はい。これは常にメソッドの最初のパラメーターです。で他のパラメータを装飾することはできませんthis。(そしてthis、拡張メソッドを記述しようとしていることをコンパイラに伝えるのは存在するという事実です。)

メソッドを囲む静的クラスはどのような役割を果たしますか? 全体の構文は非常に紛らわしいようです。

拡張メソッドを「収容」するのは単なるクラスです。拡張メソッドは、それらが記述されているクラスの他のメンバーを使用することはできますが、使用しないことがよくあります。(たとえば、拡張メソッドは、それを囲む静的クラス内でプライベート静的フィールドを使用できます。)

これを含め、多くの点で、拡張メソッドは単なる通常の静的メソッドです。最上位の静的非ジェネリック クラスにある必要があり、最初のパラメーターをoutorrefにすることはできませんが、これらの条件が満たされると、メソッドの実装に関する限り、通常のメソッドになります。メソッドを呼び出す方法に関して、呼び出し元に関する限り、それは「特別」です。(他の静的メソッドと同じ方法で呼び出すこともできます。念のため。)

同じクラスの下にあるさまざまなクラスのさまざまな拡張メソッドをグループ化できませんでしたか (1 つのクラスだけを拡張したいので意味がないようです)

はい、できます。通常は良い考えではありませんが、絶対に実行できます。

于 2013-10-16T15:21:36.413 に答える
0

メソッドが拡張しているクラス。その前にあるクラスthisですか?上記の例では、string?

はい。

メソッドを囲む静的クラスはどのような役割を果たしますか? 全体の構文は非常に紛らわしいようです。

拡張メソッド (C# プログラミング ガイド)を参照してください。

コードでは、インスタンス メソッド構文を使用して拡張メソッドを呼び出します。ただし、コンパイラによって生成される中間言語 (IL) は、コードを静的メソッドの呼び出しに変換します。

コンパイラはクラスのインスタンスを作成しないため、クラスは静的でなければなりません

同じクラスの下に、さまざまなクラスのさまざまな拡張メソッドをグループ化できませんでしたか?

はい、できます。

于 2013-10-16T15:22:18.503 に答える
0

1) はい、「this」の後の型です

2) メソッドは常にクラス内になければなりません。非静的クラス内に存在することはできません。またはメンバーであり、そのクラスの型のオブジェクトを操作する必要があります。したがって、唯一のオプションは、どこからでも呼び出すことができる静的クラスです。

3) はい、好きなようにグループ化できます。

于 2013-10-16T15:22:52.470 に答える