在C#中建模大量属性列表

本文关键字:属性 列表 建模 | 更新日期: 2023-09-27 18:27:42

我有一个对象可以具有的50个属性的列表。此对象可以具有不同类别的特性-类别1、类别2和类别3。类别1是类别2的子集,类别2是类别3的子集,而类别3是完整列表。我最初使用了struct,但现在我想知道我是否应该使用class,或者我一开始是不是用错了方法。为了方便起见,让我们将其缩减为5个属性和2个类别。

C1: A1, A2, A3
C2: A1, A2, A3, A4, A5

我想做的主要事情是将结构或类保存在我的主类上,而不区分两者。如果我使用一个类,我可以创建一个基类,2类可以从中派生,并将其保存为基类:

Category category;
...
category = new Category1();
category = new Category2();

由于我处理的是每个类别10、25、50个属性,所以类定义只是一个大的属性列表,看起来struct更适合。但如果我使用struct,看起来我必须将其保存为Object类型?这看起来很草率。

解决这个问题的正确方法是什么?


让我在这里偷偷提出第二个问题。:)那么,既然每个类(或结构)都有一个很大的属性列表,那么使用对象初始值设定项而不是使用一个包含10、25、50个参数的构造函数会更好吗?

在C#中建模大量属性列表

您应该只在以下情况下定义结构:

  • 它表示单个值(类似于int、double、long…)
  • 它小于16字节
  • 它是不可变的
  • 你不希望它经常被装箱

我认为真正的问题是为什么你有一个有50个属性的类。您可能应该考虑创建更小的逻辑类。

您将如何处理该类别变量?

使用类。我认为你不想要值语义,而且你也不会经常得到它们。数据太多。如果这些是DTO,那么听起来普通的旧类继承就是您所需要的。

class Category1 {
  public int A1 { get; set; }
  public int A2 { get; set; }
  public int A3 { get; set; }
}
class Category2 : Category1 {
  public int A4 { get; set; }
  public int A5 { get; set; }
}

我将从初始化器开始,因为构造函数将是维护性的。但是,如果您确实对它们进行了大量初始化,那么具有默认值的构造函数将允许您使用命名参数,从而产生巨大效果。所以,这取决于情况。

您可以创建一个类或一个结构,这取决于您将如何使用它们,但通常您应该只使用类。退房时间:http://msdn.microsoft.com/en-us/library/ms173109.aspx了解更多详细信息。

在回答第二个问题时,应该为没有良好默认值的参数创建带参数的构造函数。否则对象初始化程序就很好。

不过,您可能需要重新考虑您的设计。大多数设计良好的类不会有那么多属性。好的设计原则通常会指导你创建能很好地完成一件事的方法,以及代表你正在建模的最小表示的类。换句话说,如果您的类正在为汽车建模,那么它很可能具有由其他较小类表示的大型零部件的属性。

在许多情况下,将类的许多字段聚合为私有公开字段结构类型会很有帮助。这样做的目的与经常被引用的"结构规则"文档的作者所设想的使用场景完全不同,因此其中的建议在这里没有意义。例如,如果您将大多数主字段封装到一个类型PrimaryFieldStruct中,并且您的类有一个名为pf的类型字段,那么访问该结构的任何字段的成本将与该字段是类的成员而不是结构的一部分时的成本相同。然而,将字段聚合为类型PrimaryFieldStruct将使您能够将所有字段从一个类实例复制到另一个类示例。