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


286

次のようなC#コードのインスタンスをいくつか見つけました。

public static int Foo(this MyClass arg)

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


10
受け入れられた回答に加えて、C#拡張メソッドについては、MSDNの公式ドキュメントを確認する必要があります
バルカンレイヴン2012年

4
拡張メソッドは便利ですが、作成/使用時には注意が必要です-壊れる可能性があります!MSDN公式ドキュメントの一般的なガイドラインからの引用:「一般に、拡張メソッドは慎重に、必要な場合にのみ実装することをお勧めします。...拡張メソッドを使用して、ソースコードを変更できない型を拡張する場合は、タイプの実装を変更すると、拡張メソッドが機能しなくなる危険性があります。」
クリシュナグプタ2015

それはどういう意味、これは可能でしょうか?それが私が探しているものだからです。
facepalm42

回答:


274

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

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

拡張メソッドは、さまざまな有用なシナリオを可能にし、本当に強力なLINQクエリフレームワークを実現するのに役立ちます...。

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

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

のではなく

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

これにより、以下に述べるように滑らかなインターフェースを構築できます。


サブクラス化は難しい
ジェリー

@Gerry-どういう意味ですか?
Preet Sangha

9
申し訳ありませんが、少し皮肉-最近の多くの構文は、私が知らない問題さえ解決するようです。読みやすさが非常に優先されます。
Gerry

2
正直なところ、@ Gerryは、古典的なBlub Paradoxを使用しているように聞こえます。最近の多くの構文は、より良い方法があることを知らなかった、またはこの構文が素晴らしい種類のタスクを実行していないために、あなたが持っていない問題を解決します。「これは問題を解決するための解決策です」に関するほとんどのコメントは、実際には「その機能の仕組みがわからないので、役に立たないはず」の例です。
Myrddin Emrys

53

Scott Guの引用されたブログ投稿はそれをうまく説明しています。

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

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


9
これは受け入れられる答えになるはずです。thisメソッドシグネチャ内のキーワードの実際の目的が実際に何であるかを実際に説明するのは、これが唯一の答えです。他の答えは、「拡張メソッドです」としか言いようがありません。この回答を読むまで、拡張メソッドが拡張型にどのように「アタッチ」するかを完全に理解したことはありません。ありがとうございました!
Lews Therin

13

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

ここに画像の説明を入力してください

あなたには必要だ

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

拡張メソッドが使用されているコードとは別の名前空間にある場合に、拡張メソッドが表示されて使用可能になります。



4

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


1

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

したがって、以下のメソッドシグネチャでは、「this」は「String」を拡張しています。行は、メソッドへの通常の引数として関数に渡されます。public static string [] SplitCsvLine(this String line)

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

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.