代码之家  ›  专栏  ›  技术社区  ›  Jan_V

查找类使用enum、struct、public const等等?

  •  5
  • Jan_V  · 技术社区  · 14 年前

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

    首先我想做这样的事:

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

    但就我个人而言,我不太喜欢在枚举中使用字符串。 另一种选择是使用struct,如果您看到代码,它会更难看:

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

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

    4 回复  |  直到 14 年前
        1
  •  2
  •   softveda    14 年前

    我更喜欢使用工厂样式的静态属性。但这取决于具体情况。可以使用字符串或枚举作为字段。

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

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

        2
  •  4
  •   Iain Galloway    14 年前

    取决于你到底在做什么,你可能想看看 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...

        3
  •  0
  •   ChrisW    14 年前

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

        4
  •  0
  •   Michel    14 年前

    我总是用

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

    接近。

    不过,我确实创建了不止一个类:当我使用很多sessionvariables时,我创建了一个(public static)

    class SessionNames
    

    我确实在全源常数和全项目常数之间做了区别。

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