web-dev-qa-db-ja.com

C#の静的メソッドの仮パラメーターでの「this」キーワードの使用

次のようなC#コードのインスタンスがいくつかあります。

public static int Foo(this MyClass arg)

この場合、thisキーワードの意味の説明を見つけることができませんでした。洞察はありますか?

260
kpozin

これは、拡張メソッドです。 説明 についてはこちらをご覧ください。

拡張メソッドを使用すると、開発者は既存のCLR型のパブリックコントラクトに新しいメソッドを追加できます。サブクラスを作成したり、元の型を再コンパイルしたりする必要はありません。拡張メソッドは、今日の動的言語で一般的な「ダックタイピング」サポートの柔軟性と、強力に型付けされた言語のパフォーマンスおよびコンパイル時の検証を融合するのに役立ちます。

拡張メソッドは、さまざまな便利なシナリオを可能にし、本当に強力なLINQクエリフレームワークを可能にします...

それはあなたが電話できることを意味します

MyClass myClass = new MyClass();
int i = myClass.Foo();

のではなく

MyClass myClass = new MyClass();
int i = Foo(myClass);

これにより、次のように fluent interfaces を構築できます。

251
Preet Sangha

スコット・グの引用したブログ投稿 はそれをうまく説明しています。

私にとって、質問に対する答えは、その投稿の次のステートメントにあります。

上記の静的メソッドでは、文字列型の最初のパラメータ引数の前に「this」キーワードがあることに注意してください。これは、この特定の拡張メソッドを「string」型のオブジェクトに追加する必要があることをコンパイラに伝えます。 IsValidEmailAddress()メソッド実装内で、メソッドが呼び出されている実際の文字列インスタンスのすべてのパブリックプロパティ/メソッド/イベントにアクセスし、有効な電子メールかどうかに応じてtrue/falseを返します。

43
James Wiseman

Preet Sanghaの説明に加えて:
Intellisenseは、拡張メソッドを青い矢印で表示します(「Aggregate <>」の前など)。

enter image description here

あなたには必要だ

using the.namespace.of.the.static.class.with.the.extension.methods;

拡張メソッドが使用されているコードとは異なるネームスペースにある場合に、拡張メソッドが表示されて使用可能になるため。

それらは 拡張メソッド です。まったく新しい 流fluentな世界 へようこそ。 :)

7
JP Alioto

先日自分でこれを学びました:thisキーワードは、メソッドがそれを進めるクラスの拡張であることを定義します。たとえば、MyClassにはFooという新しい拡張メソッドがあります(パラメーターを受け入れず、intを返します。他のパブリックメソッドと同様に使用できます)。

3
jpoh

「this」は、パラメータリストの次のクラスを拡張します

そのため、以下のメソッドシグネチャでは、「this」は「String」を拡張します。行は、メソッドへの通常の引数として関数に渡されます。 public static string [] SplitCsvLine(この文字列ライン)

上記の例では、「this」クラスは組み込みの「String」クラスを拡張しています。

1
dcarl661