Correct me if I am wrong, but doing something like
var typeOfName = typeof(Foo).Name;
and
var nameOfName = nameof(Foo);
should give you exactly the same output. One of the understandable reasons according to this source: https://msdn.microsoft.com/en-us/library/dn986596.aspx is that
"Using nameof helps keep your code valid when renaming definitions"
If you want to get the class instance as string it is not possible to do something like that:
var fooInstance = new Foo();
var nameOfName = nameof(fooInstance);
however, you can do something like:
static string GetName<T>(T item) where T : class
{
return typeof(T).GetProperties()[0].Name;
}
var typeOfName2 = GetName(new { fooInstance });
In both cases (typeof
and nameof
) a refactoring is possible, so I dont see any other reason for reinventing another higher level keyword, such as nameof
, to perform something that already exists. Are there any differences between them that I don't clearly see?
Finally, I would appreciate if could someone point me to a reference source to have a look at the implementation of nameof
. Does it use Reflection?
Update 1: Taken from here
nameof
is apparently as efficient as declaring a string variable. No reflection or whatsoever!
var firstname = "Gigi";
var varname = nameof(firstname);
Console.WriteLine(varname); // Prints "firstname" to the console
When you check out the MSIL generated you will see that it is equivalent to a string declaration because an object reference to a string gets pushed to the stack using the ldstr operator:
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)
nameof(fooInstance)
returns"fooInstance"
. Withnameof
you get the name of the variable, not the name of the type. – Hedgepethstatic string GetName<T>(T item)
does something completely different thantypeof
ornameof
. It returns the name of a random property the Type has. It could also throw an exception if it's used in a different way than intended. – Rubellitenameof
than add my own method with anonymous types. – Fayolanameof
andtypeof
are not functions – Belew