Di C # 6, Anda dapat menggunakan nameof()
operator untuk mendapatkan string yang berisi nama variabel atau tipe.
Apakah ini dievaluasi pada waktu kompilasi, atau saat runtime melalui beberapa API Roslyn?
Di C # 6, Anda dapat menggunakan nameof()
operator untuk mendapatkan string yang berisi nama variabel atau tipe.
Apakah ini dievaluasi pada waktu kompilasi, atau saat runtime melalui beberapa API Roslyn?
Jawaban:
Iya. nameof()
dievaluasi pada waktu kompilasi. Melihat versi terbaru dari spesifikasi:
Nama ekspresi adalah konstanta. Dalam semua kasus, nameof (...) dievaluasi pada waktu kompilasi untuk menghasilkan string. Argumennya tidak dievaluasi pada waktu proses, dan dianggap sebagai kode yang tidak dapat dijangkau (namun tidak mengeluarkan peringatan "kode tidak dapat dijangkau").
Dari nameof operator - v5
Anda dapat melihatnya dengan contoh TryRoslyn ini di mana ini:
public class Foo
{
public void Bar()
{
Console.WriteLine(nameof(Foo));
}
}
Dikompilasi dan diuraikan menjadi ini:
public class Foo
{
public void Bar()
{
Console.WriteLine("Foo");
}
}
Yang setara dengan run-time adalah:
public class Foo
{
public void Bar()
{
Console.WriteLine(typeof(Foo).Name);
}
}
Seperti yang disebutkan dalam komentar, itu berarti bahwa ketika Anda menggunakan nameof
parameter tipe dalam tipe generik, jangan berharap untuk mendapatkan nama tipe dinamis aktual yang digunakan sebagai parameter tipe alih-alih hanya nama parameter tipe. Jadi ini:
public class Foo
{
public void Bar<T>()
{
Console.WriteLine(nameof(T));
}
}
Akan menjadi ini:
public class Foo
{
public void Bar<T>()
{
Console.WriteLine("T");
}
}
Saya ingin memperkaya jawaban yang diberikan oleh @ I3arnon dengan bukti bahwa jawaban itu dievaluasi pada waktu kompilasi.
Mari kita asumsikan saya ingin mencetak nama variabel di Konsol menggunakan nameof
operator:
var firstname = "Gigi";
var varname = nameof(firstname);
Console.WriteLine(varname); // Prints "firstname" to the console
Ketika Anda memeriksa MSIL yang dihasilkan, Anda akan melihat bahwa itu setara dengan deklarasi string karena referensi objek ke string didorong ke tumpukan menggunakan 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)
Anda akan melihat bahwa mendeklarasikan string nama depan dan menggunakan nameof
operator menghasilkan kode yang sama di MSIL, yang artinya nameof
seefisien mendeklarasikan variabel string.
nameof
operator, bukan string hardcode biasa?