Có. 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 (...) là được đánh giá tại thời điểm biên dịch để tạo 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 truy cập được").
Từ nameof operator - v5
Bạn có thể thấy rằng với this TryRoslyn example nơi này:
public class Foo
{
public void Bar()
{
Console.WriteLine(nameof(Foo));
}
}
Được biên soạn và dịch ngược vào này:
public class Foo
{
public void Bar()
{
Console.WriteLine("Foo");
}
}
nó chạy thời gian tương đương là:
public class Foo
{
public void Bar()
{
Console.WriteLine(typeof(Foo).Name);
}
}
Như đã đề cập trong các ý kiến, đó có nghĩa là khi bạn sử dụng nameof
trên các thông số gõ vào một kiểu generic, không mong đợi để có được tên của các loại động thực tế sử dụng như một tham số kiểu thay vì chỉ tên của thông số loại. Vì vậy, đây:
public class Foo
{
public void Bar<T>()
{
Console.WriteLine(nameof(T));
}
}
Will become này:
public class Foo
{
public void Bar<T>()
{
Console.WriteLine("T");
}
}
Roslyn là nền tảng trình biên dịch mới. Nó chỉ được sử dụng trong thời gian biên dịch. –
@PauloMorgado không đúng, bạn có thể sử dụng Rosyln trong thời gian chạy để làm việc.Chẳng hạn như xây dựng trình soạn thảo mã trực tiếp hoặc sử dụng công cụ phân tích cú pháp của Rosyln để thực hiện mọi thứ với cây hoặc biểu thức hoặc một cái gì đó –
@ChrisMarisic đó là ấn tượng của tôi, nhưng tôi đã không trả lời vì kiến thức của tôi về chủ đề bị giới hạn (do đó câu hỏi của tôi). Tôi đã đi qua này: http://scriptcs.net/ đó là một ví dụ khá tốt về sức mạnh của Roslyn, và tôi tin rằng thời gian chạy công cụ, nhưng tôi có thể sai vì tôi không khá thông tin về nó. – Gigi