9

设想

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

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

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

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


我想做什么

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

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

像这样:

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

问题...

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

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

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

4

1 回答 1

5

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

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

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

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

public const string ConstantA = nameof(ContantA);

或者

public const string ConstantA = "ConstantA";

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

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

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

于 2018-10-31T16:42:07.770 回答