静态字符串的nameof()运算符

时间:2016-04-21 19:45:42

标签: c# .net c#-6.0

我理解使用nameof()运算符进行异常处理,日志记录等。但我不明白下面直接来自某些Microsoft代码的示例。

public static class SessionKeys
{
    public static class Login
    {           
        public static string AccessToken = nameof(AccessToken); 
        public static string UserInfo = nameof(UserInfo);
    }
}

这比

更有用
public static class SessionKeys
{
    public static class Login
    {
        public static string AccessToken = "AccessToken";
        public static string UserInfo = "UserInfo";
    }
}

2 个答案:

答案 0 :(得分:15)

nameof是在编译时进行评估的运算符,因此一旦编译了应用程序,这两个解决方案之间实际上没有区别。

但是,在这种情况下使用nameof有一些好处:

  • 它使字符串值减少“魔力”。因此,不是一些断开连接的魔术字符串,而是该值背后的语义推理非常明确:它是变量本身的名称。
  • 名称是对名称的实际引用,因此它们都是连接的。这允许您重构其中任何一个并自动影响另一个。它还使“字符串”在查找对该变量的引用时显示为引用。所以你确切地知道它的使用位置。

答案 1 :(得分:6)

非常简单,第一个示例从引用的变量名称派生赋值,而第二个示例从任意字符串派生值,该字符串可能与变量名称匹配,也可能不匹配。

因此,如果您重构变量的名称,那么与这些变量关联的值也会在第一个示例中自动更新,而您必须确保更新字符串值在第二个例子中。

值得注意的是,两者都编译到引擎盖下的同一个IL,将静态字段的值推送到评估堆栈(根据LinqPad):

IL_0001:  ldsfld      UserQuery+SessionKeys+Login.AccessToken