1

私は最近、同僚が離れている間に同僚のコードを逆コンパイルすることに苦労しなければなりませんでしたが、使用する必要のあるいくつかの場所を除いて、そのほとんどが驚くほどきれいに見えることがわかりました (ILSpy に感謝します) dynamic。いくつかの部分にバラバラになりました:

  1. 呼び出しサイト コンテナー - つまり、定義上はクラスに似ていますが、dynamic使用されたメソッドが であるとしましょう。DoStuffpublic /* static? I forget */ class <DoStuff>CallSiteContainer_Plus_Some_Weirdness { /* bunch of CallSite fields */ }
  2. コンテナー内のさまざまな Cal​​lSites が割り当てられているかどうかを確認し、必要に応じて使用前にそれらを割り当てる多くのコードは、実際にはまだ得られていないアプローチを使用しています。

私の質問は、最初のポイントのクラス宣言の構文に関するものです。ジェネリック クラスのように見えますが、明らかにそうではありません。そこで何が起こっているのか説明できる人はいますか?

元のコードを作成する際に助けを求めているわけではないことに注意してください。検索と置換を賢明に使用し、自動生成されたコードを他のすべてのものから切り離すことで、すでにそれを行うことができました。しかし、CallSite コンテナー構文が有効なクラス名である理由を理解したいと思います!

4

1 に答える 1

3

このような自動生成されたクラスの例を次に示します。

private static class <>o__0
{
    public static CallSite<Action<CallSite, Type, object>> <>p__0;
}

<>o__0クラス名とフィールド名が気になる場合は<>p__0、その通りです。これらは有効な C# 名ではありませんが、コンパイラが生成する有効な IL 名ではないという意味ではありません。このような特殊な記号を使用する理由は、開発者が作成した可能性のあるクラス名と競合しないようにするためです。

于 2015-08-23T10:10:26.893 に答える