3

なぜこれがエラーにならないのか、少し混乱しています。私はこのコードが古いレガシー ソフトウェアの奥深くにあることを発見し、それが機能することに驚きました。

public static string CleanFileName(this string fileName)
{
  return CleanFileName(fileName, 64);
}

public static string CleanFileName(this string fileName, int maxLength)
{
  //some logic
}

拡張メソッドに関する私の経験は、次のように呼び出すことです。

fileName.CleanFileName(64);

これは静的メソッドでもあるためにのみ機能しますか? これは一般的な慣行であり、まだ見たことのないものですか、それとも古いレガシーコードの一部であり、火で殺す必要がありますか?

4

2 に答える 2

10

拡張メソッドは、"this" 修飾子が存在しないかのように (別名、通常の静的メソッドとして) いつでもオプションで呼び出すことができます。これを行うと読みにくくなりますが、構文的には有効です。

もう1つの答えは、「メソッド呼び出しがオーバーロードと同じ型内から行われているため機能する」ため、誤解を招くものです。拡張メソッドについて何かを意味します。たまたまどのクラスにいるかに関係なく、拡張メソッドを通常の静的メソッドとして呼び出すことができます。その意味で、クラス名を省略することができる理由は、呼び出しがオーバーロードと同じクラス内から発生しているためであるという Nathan の意見は正しいです。

于 2010-08-20T22:20:02.503 に答える
6

の呼び出しがCleanFileName(string, int)と同じ型内から行われるためCleanFileName(string)、これが機能します。これにより、拡張メソッド構文ではなく、標準メソッド構文で呼び出しを行うことができます。そのため、拡張メソッドの前に文字列インスタンスのプレフィックスは必要ありません。

意味的に言えば、またはstatic string Foo(this string foo, int bar) { }の形式で呼び出すことができます。Foo(string, int)string.Foo(int)

于 2010-08-20T22:17:47.143 に答える