C # 6'da, nameof()
bir değişkenin veya bir türün adını içeren bir dize almak için operatörü kullanabilirsiniz .
Bu, derleme zamanında mı yoksa bazı Roslyn API aracılığıyla çalışma zamanında mı değerlendirilir?
C # 6'da, nameof()
bir değişkenin veya bir türün adını içeren bir dize almak için operatörü kullanabilirsiniz .
Bu, derleme zamanında mı yoksa bazı Roslyn API aracılığıyla çalışma zamanında mı değerlendirilir?
Yanıtlar:
Evet. nameof()
derleme zamanında değerlendirilir. Teknik özelliklerin en son sürümüne bakıldığında:
İfadenin adı sabittir. Her durumda, nameof (...), bir dizge oluşturmak için derleme zamanında değerlendirilir . Argümanı çalışma zamanında değerlendirilmez ve erişilemez kod olarak kabul edilir (ancak bir "erişilemez kod" uyarısı vermez).
Gönderen NameOf operatörü - v5
Bunu bu TryRoslyn örneğiyle görebilirsiniz, burada:
public class Foo
{
public void Bar()
{
Console.WriteLine(nameof(Foo));
}
}
Şu şekilde derlenir ve derlenir:
public class Foo
{
public void Bar()
{
Console.WriteLine("Foo");
}
}
Çalışma zamanı eşdeğeri:
public class Foo
{
public void Bar()
{
Console.WriteLine(typeof(Foo).Name);
}
}
Yorumlarda belirtildiği gibi, bu, nameof
genel bir türdeki tür parametrelerinde kullandığınızda, yalnızca tür parametresinin adı yerine bir tür parametresi olarak kullanılan gerçek dinamik türün adını almayı beklemediğiniz anlamına gelir . Yani bu:
public class Foo
{
public void Bar<T>()
{
Console.WriteLine(nameof(T));
}
}
Hale gelecek bu:
public class Foo
{
public void Bar<T>()
{
Console.WriteLine("T");
}
}
@ I3arnon tarafından sağlanan yanıtı , derleme zamanında değerlendirildiğine dair bir kanıtla zenginleştirmek istedim .
nameof
Operatörü kullanarak Konsoldaki bir değişkenin adını yazdırmak istediğimi varsayalım :
var firstname = "Gigi";
var varname = nameof(firstname);
Console.WriteLine(varname); // Prints "firstname" to the console
Oluşturulan MSIL'yi teslim aldığınızda, bunun bir dize bildirimine eşdeğer olduğunu göreceksiniz çünkü bir dizeye bir nesne başvurusu, ldstr
işleci kullanılarak yığına itilir :
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)
İlk ad dizesini bildirmenin ve nameof
operatörü kullanmanın MSIL'de aynı kodu ürettiğini fark edeceksiniz , bu nameof
, bir dize değişkeni bildirmek kadar verimli olduğu anlamına gelir .
nameof
düz bir sabit kodlu dizge değil de bir operatör olduğunu anlaması ne kadar kolay olur ?