【问题标题】:Declaring constants with the nameof() the constant as the value以 of() 的名称声明常量作为值
【发布时间】:2016-11-30 12:43:15
【问题描述】:

场景

我有一个类用于声明在程序周围使用的string 常量:

public static class StringConstants
{
    public const string ConstantA = "ConstantA";
    public const string ConstantB = "ConstantB";
    // ...
}

本质上,常量的实际值是什么并不重要,因为它在分配和使用时使用。这只是为了检查。

常量名称是不言自明的,但我想尽量避免多次使用相同的字符串值。


我想做的事

我知道nameof() 是在编译时评估的,因此完全可以将const string 的值分配给nameof() 成员。

为了省去写出这些神奇的字符串,我考虑过使用nameof()这个常量本身。

像这样:

public static class StringConstants
{
    public const string ConstantA = nameof(ConstantA);
    public const string ConstantB = nameof(ConstantB);
    // ...
}

问题...

我猜除了重构之外,使用nameof() 并没有真正的好处?

在分配常量时使用nameof() 有什么影响吗?

我应该坚持只使用硬编码字符串吗?

【问题讨论】:

  • nameof 提供编译时安全
  • 很遗憾,不支持。
  • @PauloMorgado - 我不确定你的意思。什么不支持?
  • 哎呀!!!我的错!不支持使用 nameof 本身分配一个变量 - var c = nameof(c);
  • 唯一的缺点是它会在几分之一秒内减慢您的构建速度以获取符号及其名称。除此之外,它只是一个字符串。

标签: c# constants nameof


【解决方案1】:

虽然我认为nameof 的使用很聪明,但我可以想到一些可能会给您带来问题的场景(并非所有这些都适用于您):

1/ 有些字符串值的名称和值不能相同。例如,任何以数字开头的字符串值都不能用作常量的名称。因此,您将遇到无法使用nameof 的例外情况。

2/ 根据这些值的使用方式(例如,如果它们是存储在数据库、xml 文件等中的值的名称),那么您无权更改这些值 - 这很好,直到您来重构。如果您想重命名一个常量以使其更具可读性(或纠正以前开发人员的拼写错误),那么如果您使用的是nameof,则无法更改它。

3/ 对于必须维护您的代码的其他开发人员,请考虑哪个更具可读性:

public const string ConstantA = nameof(ContantA);

public const string ConstantA = "ConstantA";

我个人认为是后者。在我看来,如果你走nameof 路线,那可能会让其他开发人员停下来想知道你为什么这样做。这也意味着常量的名称很重要,而如果您的使用场景与我的类似,那么值很重要,名称是为了方便。

如果您承认有时您无法使用nameof,那么使用它有什么真正的好处吗?除了上述之外,我没有看到任何缺点。我个人主张坚持使用传统的硬编码字符串常量。

总而言之,如果您的目标只是确保您不会多次使用相同的字符串值,那么(因为如果两个名称相同,这会给您一个编译器错误)这将是一个非常有效的解决方案。

【讨论】:

  • 感谢您的有益见解,布赖恩!可读性对我来说是一件大事,其他开发人员能够轻松理解正在发生的事情。对于其他人来说,可能更重要的是要考虑重构,其中常量用于数据访问 - 您不想重命名常量并破坏它(尽管上面的示例仅限于应用程序代码)。我倾向于同意第 1 点,但我认为大多数编译器/IDE 会阻止您尝试定义以数字开头的成员 - 仍然是一个非常有效的观点。
猜你喜欢
  • 2020-11-22
  • 2014-06-23
  • 1970-01-01
  • 2012-06-29
  • 1970-01-01
  • 1970-01-01
  • 2014-05-08
  • 2017-04-24
  • 1970-01-01
相关资源
最近更新 更多