在C# 6中,可以使用
这是否在编译时评估,还是通过某些Roslyn API在运行时评估?
nameof()
操作符获取包含变量或类型名称的字符串。这是否在编译时评估,还是通过某些Roslyn API在运行时评估?
nameof()
操作符获取包含变量或类型名称的字符串。nameof()
在编译时被评估。从最新版本的规范中可以看出: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));
}
}
将变成这样:
public class Foo
{
public void Bar<T>()
{
Console.WriteLine("T");
}
}
control.ValueMember = <member name>
的内容时,这对于 DataSource 非常有用,特别是在使用 DotFuscator 后。 - Leonardo Hernándeznameof
运算符在控制台上打印变量的名称: var firstname = "Gigi";
var varname = nameof(firstname);
Console.WriteLine(varname); // Prints "firstname" to the console
当您检查生成的 MSIL 时,您会发现它等同于字符串声明,因为使用 ldstr
运算符将字符串的对象引用推送到堆栈上:
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)
nameof
运算符在MSIL中生成相同的代码,这意味着nameof
与声明一个字符串变量一样高效。nameof
运算符而不是纯粹的硬编码字符串? - ADTCnameof()
也适用于你拥有引用的任何东西(例如nameof(someObject.SomeProperty)
将被翻译为"SomeProperty"
)。当反编译器只有一个字符串字面量时,它应该如何可靠地找出这个字符串来自哪个对象呢?请注意,不应更改原始含义。 - Adwaenyth