1

操作のないメソッドがあり、渡されたパラメーターを返す場合、コンパイラーは生成されたMSILからそれを削除しますか?

例えば:

public partial class StringResource {

    /// <summary>About</summary>
    public static string About { get { return Encode(Resources.WebUI.About); } }

    public static string Encode(string s) { return s; }
}

C#コンパイラはEncodeメソッドを生成しますか?生成されたILを確認し、メソッドがある場合とない場合のコードを比較するにはどうすればよいEncodeですか?

そして、静的コンパイラーがそれを削除しない場合、ランタイムJITコンパイラーはどうでしょうか?

4

1 に答える 1

2

操作のないメソッドがあり、渡されたパラメーターを返す場合、コンパイラーは生成されたMSILからそれを削除しますか?

いいえ、できませんでした。リフレクションなどを介してそのメソッドを呼び出そうとしたものはすべて壊れてしまいます。

この方法は、JITによって何にもインライン化されない可能性がありますが、それは別の問題です。メソッドをインライン化できるかどうかを決定するさまざまなものがあり、それらの詳細は、CLRのバージョン、プロセスアーキテクチャーなどによって異なります。空のメソッドの場合、(デバッガーで実行されていない場合)非インライン化されることを期待します。 -仮想呼び出し。

生成されたILを確認し、Encodeメソッドがある場合とない場合のコードを比較するにはどうすればよいですか?

  1. コードをコンパイルします。
  2. 分解します。たとえば、 `ildasmFoo.dll/out=before.ilを使用します。
  3. コードを変更する
  4. コンパイル
  5. 分解します。ildasm Foo.dll /out=after.il
  6. 比較before.ilしてafter.il
于 2012-11-30T15:39:45.580 に答える