Trong C # 6, bạn có thể sử dụng nameof()
toán tử để lấy một chuỗi chứa tên của một biến hoặc một kiểu.
Điều này được đánh giá tại thời điểm biên dịch hay trong thời gian chạy thông qua một số API Roslyn?
Trong C # 6, bạn có thể sử dụng nameof()
toán tử để lấy một chuỗi chứa tên của một biến hoặc một kiểu.
Điều này được đánh giá tại thời điểm biên dịch hay trong thời gian chạy thông qua một số API Roslyn?
Câu trả lời:
Đúng. nameof()
được đánh giá tại thời điểm biên dịch. Nhìn vào phiên bản mới nhất của thông số kỹ thuật:
Biểu thức tên là một hằng số. Trong mọi trường hợp, nameof (...) được đánh giá tại thời điểm biên dịch để tạo ra một chuỗi. Đối số của nó không được đánh giá trong thời gian chạy và được coi là mã không thể truy cập (tuy nhiên nó không phát ra cảnh báo "mã không thể truy cập").
Bạn có thể thấy điều đó với ví dụ TryRoslyn này, trong đó:
public class Foo
{
public void Bar()
{
Console.WriteLine(nameof(Foo));
}
}
Được biên dịch và dịch ngược thành:
public class Foo
{
public void Bar()
{
Console.WriteLine("Foo");
}
}
Thời gian chạy tương đương của nó là:
public class Foo
{
public void Bar()
{
Console.WriteLine(typeof(Foo).Name);
}
}
Như đã đề cập trong các nhận xét, điều đó có nghĩa là khi bạn sử dụng nameof
tham số kiểu trong một kiểu chung, đừng mong đợi nhận được tên của kiểu động thực tế được sử dụng làm tham số kiểu thay vì chỉ tên của tham số kiểu. Vì vậy, điều này:
public class Foo
{
public void Bar<T>()
{
Console.WriteLine(nameof(T));
}
}
Sẽ trở thành thế này:
public class Foo
{
public void Bar<T>()
{
Console.WriteLine("T");
}
}
Tôi muốn làm phong phú thêm câu trả lời do @ I3arnon cung cấp với bằng chứng rằng nó được đánh giá tại thời điểm biên dịch.
Giả sử tôi muốn in tên của một biến trong Bảng điều khiển bằng nameof
toán tử:
var firstname = "Gigi";
var varname = nameof(firstname);
Console.WriteLine(varname); // Prints "firstname" to the console
Khi bạn kiểm tra MSIL được tạo, bạn sẽ thấy rằng nó tương đương với một khai báo chuỗi vì một tham chiếu đối tượng đến một chuỗi được đẩy vào ngăn xếp bằng cách sử dụng ldstr
toán tử:
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)
Bạn sẽ nhận thấy rằng việc khai báo chuỗi tên đầu tiên và sử dụng nameof
toán tử sẽ tạo ra cùng một mã trong MSIL, có nghĩa nameof
là hiệu quả như khai báo một biến chuỗi.
nameof
toán tử, không phải là một chuỗi mã cứng thuần túy?