使用嵌套类来定义常量?

23

使用嵌套类来组合常量有什么问题?

像这样:

public static class Constants
{
    public static class CategoryA
    {
        public const string ValueX = "CatA_X";
        public const string ValueY = "CatA_Y";
    }
    public static class CategoryB
    {
        public const string ValueX = "CatB_X";
        public const string ValueY = "CatB_Y";
    }
}

使用方法如下:

Console.WriteLine(Constants.CategoryA.ValueY);
Console.WriteLine(Constants.CategoryB.ValueX);

你还可以将 "Constants" 类设置为 partial(部分类)……

3个回答

23

这里有一些准则(更新至fx 4.5版本)针对公共嵌套类:

√ 当嵌套类型与其外部类型之间的关系需要成员可访问性语义时,使用嵌套类型。

X 避免公开嵌套类型。唯一的例外情况是,如果仅在罕见的情况下需要声明嵌套类型的变量,例如子类化或其他高级定制场景。

X 如果该类型可能被包含类型外部引用,请勿使用嵌套类型。

我认为你的示例符合第一点(即:你很好)。


很高兴听到这个消息,你有什么想法为什么这种用法不是更普遍的吗?我不可能是唯一一个想到它的人吧? - user121292
也许你高估了使用情况。常量通常与它们的类自然地组织在一起。而且类不应该变得太大,以至于它们的成员需要分组。 - H H
1
过多的常量绝对是糟糕设计的潜在迹象;然而在我的情况下,我们谈论的是大量使用常量的SharePoint。 - user121292
这种情况非常适合单元测试和生成测试数据。然而,我不建议将其作为正常类设计的首选方案。 - Michael Brown
1
似乎链接的文档已更新以包括这一点:“不要使用公共嵌套类型作为逻辑分组构造;使用命名空间进行此操作。” 这似乎与现在的答案相矛盾。 - Leon7C
唯一的例外是如果嵌套类型的变量只需要在罕见的情况下声明,例如子类化或其他高级定制场景。有示例吗? - Kiquenet

3
“谁说这是错的?常量可以(而且也确实)在类层次结构的任何地方定义。”

是的,我认为这很不错 - 但我还没有看到它被实现,所以我怀疑会有一些副作用... - user121292
2
我认为这不是关于常量,而是关于嵌套类。 - H H
1
实际上,使用嵌套类来定义常量可以完全覆盖或扩展子类的常量。这个概念还有额外的好处。 - Aren

2

并不是说你做错了,但是考虑使用命名空间,像这样:

namespace Constants
{
    public static class CategoryA
    {
        public const string ValueX = "CatA_X";
        public const string ValueY = "CatA_Y";
    }
    public static class CategoryB
    {
        public const string ValueX = "CatB_X";
        public const string ValueY = "CatB_Y";
    }
}

没错,当你有两个层级——类别和值时,这将起作用,但是对于嵌套类,你可以添加无限数量的层级;例如语言。Languages.English.American = "en-US"。 - user121292
(不添加其他命名空间,我应该添加...) - user121292
1
但为什么不添加命名空间呢?在某些情况下,这可能更好,您可以在另一个文件/程序集中添加到命名空间。 - H H
4
是的,但使用命名空间的缺点是无法在其上设置常量。另外,使用类可以通过编程方式添加具有默认值/组合常量等属性。 - user121292

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接