次のようなC#コードのインスタンスをいくつか見つけました。
public static int Foo(this MyClass arg)
this
この場合のキーワードの意味の説明を見つけることができませんでした。洞察はありますか?
次のようなC#コードのインスタンスをいくつか見つけました。
public static int Foo(this MyClass arg)
this
この場合のキーワードの意味の説明を見つけることができませんでした。洞察はありますか?
回答:
これは拡張メソッドです。説明はこちらをご覧ください。
拡張メソッドを使用すると、開発者は既存のCLR型のパブリックコントラクトに新しいメソッドを追加できます。サブクラス化したり、元の型を再コンパイルしたりする必要はありません。拡張メソッドは、今日動的言語で広く使用されている「ダックタイピング」サポートの柔軟性と、強く型付けされた言語のパフォーマンスおよびコンパイル時の検証を融合するのに役立ちます。
拡張メソッドは、さまざまな有用なシナリオを可能にし、本当に強力なLINQクエリフレームワークを実現するのに役立ちます...。
それはあなたが電話できることを意味します
MyClass myClass = new MyClass();
int i = myClass.Foo();
のではなく
MyClass myClass = new MyClass();
int i = Foo(myClass);
これにより、以下に述べるように滑らかなインターフェースを構築できます。
Scott Guの引用されたブログ投稿はそれをうまく説明しています。
私にとって、質問への答えはその投稿の次のステートメントにあります:
上記の静的メソッドでは、文字列型の最初のパラメーター引数の前に「this」キーワードがあることに注意してください。これは、この特定の拡張メソッドを「string」型のオブジェクトに追加する必要があることをコンパイラに通知します。IsValidEmailAddress()メソッドの実装内で、メソッドが呼び出されている実際の文字列インスタンスのすべてのパブリックプロパティ/メソッド/イベントにアクセスし、有効な電子メールかどうかに応じてtrue / falseを返すことができます。
this
メソッドシグネチャ内のキーワードの実際の目的が実際に何であるかを実際に説明するのは、これが唯一の答えです。他の答えは、「拡張メソッドです」としか言いようがありません。この回答を読むまで、拡張メソッドが拡張型にどのように「アタッチ」するかを完全に理解したことはありません。ありがとうございました!
Preet Sanghaの説明に加えて
、Intellisenseは拡張メソッドを青い矢印で表示します(たとえば、「Aggregate <>」の前):
あなたには必要だ
using the.namespace.of.the.static.class.with.the.extension.methods;
拡張メソッドが使用されているコードとは別の名前空間にある場合に、拡張メソッドが表示されて使用可能になります。