【问题标题】:Lookup class use enum, struct, public const, something else?查找类使用 enum、struct、public const 还是其他?
【发布时间】:2011-05-17 04:59:27
【问题描述】:

我正在创建一个查找类,因此将在所有项目中使用一个常量值。 问题是,有几种解决方案可以创建这样的东西。我可以创建一个包含枚举、结构或常量的类,或者为每个“对象”创建一个类。我想知道什么是最好的解决方案。

首先我想这样做:

public static class Defines
    {
        public enum PAGELAYOUT_NAMES
        {
            STANDARD = "Standard"
        }
    }

但我个人不太喜欢在枚举中使用字符串。 另一种选择是使用结构体,如果你看到代码就更难看了:

public static class Defines
    {
        public struct PAGELAYOUT_NAMES
        {
            public static string STANDAARD = "Standaard";
        }
    }

这看起来更好一些,但是当有很多选项时可能会令人困惑:

public static class Defines
{
        public const string PAGELAYOUT_NAMES_STANDARD = "Standard";
}

在输入这篇文章时,我认为这将是最好/干净的选择:

public static class PageLayout
{
    public const string STANDARD = "Standard";
}

还有其他建议吗? 用几个只定义一些常量的类填充项目在我看来像是很多开销和混乱。

编辑 在原始上下文中不是很清楚,但查找值不仅限于字符串。以下一些非常好的建议只有在您只使用字符串时才有可能,但也需要支持 Int、DateTime 和其他类型。从这里的答案中得到了一些不错的想法,我将尝试哪个最适合我当前的项目。

最终实施的解决方案 感谢以下建议,我实现了这样的查找类:

 internal class Base<T>
    {
        internal T Value{ get; private set;}
        internal Base(T value)
        {
            Value = value;
        }
    }
    public class PageLayout
    {
        public static string Standard { get { return new Base<string>("Standard").Value; } }
    }

这是基于下面给出的答案。 原因是因为现在我也可以将它用于非字符串和整数,这对于带有描述和资源文件的枚举来说是不可能的,即使这对我来说会更干净。

【问题讨论】:

    标签: c# dictionary constants lookup


    【解决方案1】:

    根据您正在做什么,您可能想查看Resources。

    您定义一个 xml 文件(或使用设计器来帮助您),然后它被编译成一个程序集(嵌入式或“卫星程序集”)。

    在解决方案资源管理器中右键单击类库下的属性节点,单击“打开”并转到资源选项卡。从那里开始非常简单。

    一旦设置好,就很容易从代码中获取值,例如:-

    String s = Resources.PageLayoutNames.Standard;
    

    有一些复杂的情况,但在不了解您的应用的情况下,我无法提供更多建议。想到的一个问题是,如果您正在对 ASP.NET 应用程序进行单元测试,则需要确保资源被嵌入而不是作为卫星部署,否则单元测试将不起作用。

    它们也用于全球化,所以熟悉它们是件好事。


    编辑:

    在再次阅读您的问题后,我倾向于问“您需要字符串做什么?”。

    你在做什么,你不能只用一个枚举?

    enum PageLayouts
    {
      Standard,
      ExtraAwesome
    }
    

    如果您尝试将要显示的文本映射到枚举类型,有很多方法可以做到这一点,例如using the DescriptionAttribute

    enum PageLayouts
    {
       [Description("Standard")]
       Standard,
       [Description("Extra Awesome")]
       ExtraAwesome
    }
    

    但是,您不能为 DescriptionAttribute 提供开箱即用的资源键。 You have to subclass it if you want to support globalisation...

    【讨论】:

      【解决方案2】:

      我更喜欢这种使用工厂样式静态属性的方式。但这取决于确切的场景。您可以使用字符串或枚举作为字段。

       public class PageLayout
          {
              private readonly string LayoutType;
              private PageLayout(string layoutType)
              {
                LayoutType = layoutType;
              }
              public static Standard {get {return new PageLayout("Standard");}}
          }
      

      然后在调用代码中使用PageLayout.Standard

      【讨论】:

      • 尽管我喜欢 Iain Galloway 他的建议的简洁性,但我已经实现了这个,因为您还可以添加非字符串和整数值,例如 Guids、DateTime 等。
      【解决方案3】:

      人们建议不要使用公共嵌套类,因此在您之前的示例中,Defines 应该是命名空间而不是外部类。

      【讨论】:

        【解决方案4】:

        我总是使用

        public static class PageLayout 
        { 
            public const string STANDARD = "Standard"; 
        } 
        

        接近。

        然而,我确实创建了多个类:当我使用大量会话变量时,我创建了一个(公共静态)

        class SessionNames
        

        而且我确实在灵魂范围常量和项目范围常量之间有所不同。

        有时一个项目的常量(例如,您必须创建的 PDF 中的 20 个占位符)与其他项目无关,所以我将其设为项目类,但当我有解决方案范围的常量时,我​​会在与我放置字符串扩展名等的地方相同。

        【讨论】:

        • 如果您使用“const”值,您需要非常小心。它们被编译为引用程序集的文字。这意味着如果常量值发生变化,您需要重新编译 所有 dll,而不仅仅是包含已更改常量的那个。请参阅此处的注释:- msdn.microsoft.com/en-us/library/ms173119.aspx
        猜你喜欢
        • 1970-01-01
        • 2022-11-04
        • 2023-01-30
        • 1970-01-01
        • 2021-05-24
        • 1970-01-01
        • 2014-05-18
        • 2020-07-09
        • 1970-01-01
        相关资源
        最近更新 更多