【问题标题】:What is the best "place" to hold read-only structured data?保存只读结构化数据的最佳“位置”是什么?
【发布时间】:2011-07-05 07:41:01
【问题描述】:

我持有枚举类型的结构化只读数据,现在我想扩展结构并为枚举中的每个值添加额外的字段。所以,我原来的枚举是:

public enum OutputFormats { Pdf, Jpg, Png, Tiff, Ps };

我想像这样扩展它们:

Value=Pdf
FileName="*.PDF"
ID=1

Value=Jpg
FileName="*.jpg"
ID=2

...等等。

枚举不能保存多维数据结构,那么通常认为保存此类结构化数据的最佳“位置”是什么?我应该创建一个具有valuefilenameid 属性的类并在类构造函数中初始化数据吗?

【问题讨论】:

  • 是的,这种事情一般都是使用类来完成的。除非您要求实例具有值类型语义,否则使用结构没有特别的优势。
  • 这似乎太模糊了。当然,类或结构可以工作,如果除了只读数据之外没有任何约束/要求,那么任何一个都可以。

标签: c# class struct


【解决方案1】:

也许这个伪枚举模式会有用:

public class OutputFormats
{
    public readonly string Value;
    public readonly string Filename;
    public readonly int ID;

    private OutputFormats(string value, string filename, int id)
    {
        this.Value = value;
        this.Filename = filename;
        this.ID = id;
    }

    public static readonly OutputFormats Pdf = new OutputFormats("Pdf", "*.PDF", 1);
    public static readonly OutputFormats Jpg = new OutputFormats("Jpg", "*.JPG", 2);
}

另一种变体,也许更简洁:

public class OutputFormats
{
    public string Value { get; private set; }
    public string Filename { get; private set; }
    public int ID { get; private set; }

    private OutputFormats() { }

    public static readonly OutputFormats Pdf = new OutputFormats() { Value = "Pdf", Filename  = "*.PDF", ID = 1 };
    public static readonly OutputFormats Jpg = new OutputFormats() { Value = "Jpg", Filename = "*.JPG", ID = 2 };
}

【讨论】:

  • 抱歉,您的值初始化代码包含错误,无法编译。
  • @Tomas - 对不起,我应该说这是大脑编译的代码。您应该能够自己解决语法错误,不是吗?
【解决方案2】:

是的,创建一个具有 Value、Filename 和 ID 属性的类 OutputFormat。您可以将数据存储在 XML 文件中并将 XML 文件解析为 List,或者您可以在代码中的某处初始化 OutputFormat 对象。

【讨论】:

    【解决方案3】:

    创建具有只读属性和字段的类或结构,如下所示:

     struct OutputFormat
     {
          public int Id { get; private set; }
          public OutputFormats Format { get; private set; }
          public string Filename { get; private set; }
    
          public OutputFormat(int id, OutputFormats format, string filename)
          {
              Id = id;
              Format = format; 
              Filename = filename;
          }
     }
    

    【讨论】:

      【解决方案4】:
      // using a string key makes it easier to extend with new format.
      public interface IOutputRepository
      {
          //return null if the format was not found
          Output Get(string name);
      }
      
      // fetch a format using a static class with const strings.
      var output = repository.Get(OutputFormats.Pdf);
      

      【讨论】:

        【解决方案5】:

        我认为我会考虑为此使用结构。它们非常适合此类一旦创建就不会更改的数据。

        http://msdn.microsoft.com/en-us/library/ah19swz4(v=vs.71).aspx

        安德鲁

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2012-01-22
          • 2016-12-15
          • 1970-01-01
          • 2011-01-14
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多