CallerMemberName属性を使用すると、INotifyPropertyChangedインターフェイスを実装するときに、メンバー名を呼び出されたメソッドのString引数として指定しないようにできます。CallerMemberNameAttributeはリフレクションを使用しますか
質問は、シーンの後ろの反射を使用していますか?ハードコーディングよりパフォーマンスが悪いのですか?
CallerMemberName属性を使用すると、INotifyPropertyChangedインターフェイスを実装するときに、メンバー名を呼び出されたメソッドのString引数として指定しないようにできます。CallerMemberNameAttributeはリフレクションを使用しますか
質問は、シーンの後ろの反射を使用していますか?ハードコーディングよりパフォーマンスが悪いのですか?
いいえ;コンパイラはコンパイル時にメンバー名を直接ハードコーディングします。 ILに関しては、これはldstr
です。例えば、我々はコンパイルした場合:
static void Implicit()
{
Log();
}
static void Explicit()
{
Log("Explicit");
}
static void Log([CallerMemberNameAttribute] string name = null)
{}
は、我々が得る:あなたが見ることができるように
.method private hidebysig static void Implicit() cil managed
{
.maxstack 8
L_0000: ldstr "Implicit"
L_0005: call void Program::Log(string)
L_000a: ret
}
.method private hidebysig static void Explicit() cil managed
{
.maxstack 8
L_0000: ldstr "Explicit"
L_0005: call void Program::Log(string)
L_000a: ret
}
- ILは、名前がで焼いた直接正確我々は、文字列を入れているかのように同じ手動で
私はそれを逆コンパイルしようとしましたが、何も入っていないので、属性自身がリフレクションを使用しているようには見えません。一方、それは属性自体がいくつかの特別な方法でコンパイラによって処理されるので、パフォーマンス上のペナルティがあってはならないことを示唆するSystem.Runtime.CompilerServices
に配置されています。
潜在的なパフォーマンスヒットをテストしたときの結果は? –