作者热门文章
- r - 以节省内存的方式增长 data.frame
- ruby-on-rails - ruby/ruby on rails 内存泄漏检测
- android - 无法解析导入android.support.v7.app
- UNIX 域套接字与共享内存(映射文件)
在 C# 6 中,您可以使用 nameof()
运算符获取包含变量或类型名称的字符串。
这是在编译时评估还是在运行时通过某些 Roslyn API 评估?
最佳答案
是的。 nameof()
在编译时计算。查看最新版本的规范:
The nameof expression is a constant. In all cases, nameof(...) is evaluated at compile-time to produce a string. Its argument is not evaluated at runtime, and is considered unreachable code (however it does not emit an "unreachable code" warning).
你可以用 this TryRoslyn example 看到这是:
public class Foo
{
public void Bar()
{
Console.WriteLine(nameof(Foo));
}
}
编译反编译成这样:
public class Foo
{
public void Bar()
{
Console.WriteLine("Foo");
}
}
它的运行时等价物是:
public class Foo
{
public void Bar()
{
Console.WriteLine(typeof(Foo).Name);
}
}
如评论中所述,这意味着当您在泛型类型的类型参数上使用 nameof
时,不要期望获得用作类型参数的实际动态类型的名称而不仅仅是类型参数的名称。所以这个:
public class Foo
{
public void Bar<T>()
{
Console.WriteLine(nameof(T));
}
}
Will become这个:
public class Foo
{
public void Bar<T>()
{
Console.WriteLine("T");
}
}
关于c# - nameof() 是否在编译时评估?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26573102/
我是一名优秀的程序员,十分优秀!