【问题标题】:Using nested classes for constants?对常量使用嵌套类?
【发布时间】:2011-02-26 02:17:32
【问题描述】:

使用嵌套类对常量进行分组有什么问题?

像这样:

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);

您也可以使“常量”类部分...

【问题讨论】:

    标签: c# class-design constants nested-class


    【解决方案1】:

    有一些 guideline(针对 fx 4.5 更新)针对公共嵌套类:

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

    X 避免公开暴露的嵌套类型。唯一的例外是嵌套类型的变量仅在极少数情况下需要声明,例如子类化或其他高级自定义场景。

    如果类型可能在包含类型之外被引用,则不要使用嵌套类型。

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

    【讨论】:

    • 很高兴听到,关于为什么这种用途没有得到更广泛的任何想法 - 我不能是唯一一个想到它的人吗?
    • 也许你高估了用例。常量通常与它们的类一起很自然地组织起来。并且类不应该变得太大以至于他们的成员需要分组。
    • 常量太多肯定是设计不好的潜在标志;但是在我的例子中,我们谈论的是大量使用常量的 SharePoint。
    • 这个场景非常适合单元测试和生成测试数据。但是,我不建议将其作为普通班级设计的选择。
    • 链接文档似乎已更新为包含这一点:“不要使用公共嵌套类型作为逻辑分组结构;为此使用命名空间。”这似乎与现在的答案相矛盾。
    【解决方案2】:

    谁说错了?常量可以(并且被)定义在类层次结构中的任何位置。

    【讨论】:

    • 是的,我认为它非常简洁 - 但我还没有看到它这样做,所以我怀疑有一些副作用......
    • 我认为这不是关于常量而是嵌套类。
    • 实际上将嵌套类用于常量允许您完全覆盖或扩展它们以用于子类。这个概念还有其他好处。
    【解决方案3】:

    不是说你做错了,而是像这样使用命名空间呢:

    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".
    • (不添加额外的命名空间我应该添加...)
    • 但是为什么不添加命名空间呢?在某些情况下可能会更好,您可以将 ns 添加到另一个文件/程序集中。
    • 是的,但是使用命名空间的缺点是你不能在它们上面设置常量。还可以通过类添加以编程方式获取默认值/组合常量等的属性。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-29
    • 1970-01-01
    • 2013-04-26
    相关资源
    最近更新 更多