2

私のコードには、アクションメソッドに次のものがあります:

    catch (Exception e)
    {
        log(e);
        return Content(ExceptionExtensions.GetFormattedErrorMessage(e));
    }

呼び出される関数は次のようになります。

public static class ExceptionExtensions
{
    public static string GetFormattedErrorMessage(this Exception e)

            if (e == null)
        {
            throw new ArgumentNullException("e");
        }

パラメータリストの先頭に「this」がある理由を誰かが説明できますか?

4

4 に答える 4

8

これは拡張メソッドのシグネチャです。それらは .NET3.5(C#3) で導入されました。コンパイラがないthisと、静的メソッド シグネチャとして取得されます。次のコードで:

public class Foo
{
    public void FooBar()
    {

    }
}
public static class FooEx
{
    public static void Bar(this Foo f)
    {
        f.FooBar();
    }
    public static void StaticBar(Foo f)
    {
        f.FooBar();
    }
}

次のように静的メソッドを呼び出すことができます。

FooEx.StaticBar(new Foo());

そして、次のような拡張メソッド:

new Foo().Bar();

静的メソッドとしての拡張メソッド:

FooBar.Bar(new Foo());

したがって、拡張メソッドを静的メソッドに変換するにはthis、署名からキーワードを削除するだけです。ただし、静的メソッドを拡張メソッドに変換する場合は、次のことを行う必要があります。

  1. this署名にキーワードを追加する
  2. public staticメソッドをネストされていないクラスに入れる
  3. メソッドのアクセス修飾子を作るpublic

Scott Hanselman は、構文の選択と、コンパイラへの最小限の変更で既存の CLR にどのように適合するかについて、優れた記事を書いています。

要約すると、彼は、コンパイル後、生成された静的メソッドの IL コードと拡張メソッドのコードに違いはないと結論付けています。キーワードは、this拡張メソッドの周りにいくつかのメタデータを配置するようにコンパイラに指示するためにあります。

私の推測では、this1. すでに存在し、2. 他の既存のキーワードと比較して、拡張メソッドのコンテキストにその既存の意味が最も適しているため、彼らはそのキーワードを採用したと考えられます。

于 2012-05-24T03:02:59.183 に答える
2

それが「拡張」メソッドを定義する方法だからです。これにより、この特定のメソッドをオブジェクトで直接呼び出すことができるようにする必要があることがコンパイラに通知され、次のようなコードを記述できるようになります。

GetFormattedErrorMessage(e);

代わりに:

e.GetFormattedErrorMessage();

あなたが投稿したコードがそのように関数を呼び出している理由がわかりません。例外オブジェクトで関数を直接呼び出すことができるはずです。拡張メソッドは基本的に、他の方法では変更できない組み込みクラス/型の動作を拡張する方法です。

于 2012-05-24T03:04:55.497 に答える
2

すでに述べた拡張方法、いくつかのリンク:

さらに、Google からの通常の多数のブログ投稿やその他のドキュメント。

于 2012-05-24T03:06:28.617 に答える
-1

「this」は、関数で「this」を使用する場合と同様に、Exception メソッドに渡されるエラーです。渡された例外を参照しているだけです。

于 2012-05-24T03:02:26.073 に答える