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

nameof() operator for static string

我了解使用 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";
    }
}

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

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

值得注意的是,两者在底层都编译为相同的 IL,将静态字段的值推入计算堆栈(根据 LinqPad):

IL_0001:  ldsfld      UserQuery+SessionKeys+Login.AccessToken

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

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

  • 它使字符串值不那么“神奇”。因此,该值背后的语义推理不是一些断开连接的魔术字符串,而是非常清楚:它是变量本身的名称。
  • 名字是对名字的实际引用,所以它们都是有联系的。这允许您重构其中一个并自动影响另一个。它还使该“字符串”在查找对该变量的引用时显示为引用。所以你确切地知道它被用在哪里。