使用nameof()将常量声明为常量作为值

时间:2016-11-30 12:43:16

标签: c# constants nameof

方案

我有一个类用于声明程序周围使用的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()会有什么影响吗?

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

1 个答案:

答案 0 :(得分:2)

虽然我认为使用import matplotlib matplotlib.use("TkAgg") from matplotlib import pyplot as plt 很聪明,但我可以想到一些可能会给您带来麻烦的情况(并非所有这些情况都可能适用于您):

1 /有些字符串值的名称和值不能相同。例如,任何以数字开头的字符串值都不能用作常量的名称。因此,在无法使用nameof的地方会有一些例外。

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

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

nameof

public const string ConstantA = nameof(ContantA);

我个人认为是后者。我认为,如果您走public const string ConstantA = "ConstantA"; 路线,那么这可能会使其他开发人员停下来并想知道您为什么这样做。这也暗示着常量的名称很重要,而如果您的使用情况像我的那样,那么值很重要,并且该名称是为了方便。

如果您接受到有时无法使用nameof的话,那么使用它真的有任何真正的好处吗?除了以上所述,我看不到任何不利之处。我个人会提倡坚持使用传统的硬编码字符串常量。

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