私が間違っている場合は修正してください。
var typeOfName = typeof(Foo).Name;
と
var nameOfName = nameof(Foo);
まったく同じ出力が得られるはずです。このソースによると理解できる理由の 1 つ: https://msdn.microsoft.com/en-us/library/dn986596.aspxは、
「nameof を使用すると、定義の名前を変更するときにコードを有効に保つことができます」
クラスインスタンスを文字列として取得したい場合、そのようなことはできません:
var fooInstance = new Foo();
var nameOfName = nameof(fooInstance);
ただし、次のようなことができます。
static string GetName<T>(T item) where T : class
{
return typeof(T).GetProperties()[0].Name;
}
var typeOfName2 = GetName(new { fooInstance });
どちらの場合も (typeof
およびnameof
) リファクタリングが可能であるため、nameof
既存のものを実行するために、 などの別の上位レベルのキーワードを再発明する理由は他にありません。私がはっきりと見ていない違いはありますか?
最後に、誰かが の実装を確認するための参照ソースを教えていただければ幸いですnameof
。リフレクションを使用していますか?
更新 1:ここ から取得
nameof
文字列変数を宣言するのと同じくらい効率的です。反射も何もありません!
var firstname = "Gigi";
var varname = nameof(firstname);
Console.WriteLine(varname); // Prints "firstname" to the console
生成された MSIL をチェックアウトすると、ldstr 演算子を使用して文字列へのオブジェクト参照がスタックにプッシュされるため、文字列宣言と同等であることがわかります。
IL_0001: ldstr "Gigi"
IL_0006: stloc.0
IL_0007: ldstr "firstname"
IL_000c: stloc.1
IL_000d: ldloc.1
IL_000e: call void [mscorlib]System.Console::WriteLine(string)