如何实例化一个大的不可变类型?

Nic*_*sen 4 c# instantiation immutability

我有一个类型,有大约40个属性(所有值类型),代表我的业务的一种交易.此类的实例对应于我的数据库中的一行.我想保持我的类不可变,因为它只会用于读取操作,但我不知道如何在初始化期间设置40个属性.

通常我对不可变类型使用构造函数初始化,但我想避免编写带有40个参数的构造函数.我的房产的安装人员目前是私人的,但我愿意以足够的理由改变.是否有一种常见的方法来处理这种情况或更好的方法来解决问题?

Jud*_*ngo 10

你的问题不是一个有40个参数的构造函数,而是一个有40个字段的类.

我建议打破这个.是否有任何相关领域?如果是这样,将它们分组到一个公共对象(例如EmailInfo),然后让你的大对象引用分组对象.

// Instead of this:
foo.EmailHeader
foo.EmailSubject
foo.Email...

// Do this:
foo.Email.Header
foo.Email.Subject
Run Code Online (Sandbox Code Playgroud)

一旦你的类具有较少的直接属性,创建一个获取这些分组对象的构造函数并不是那么糟糕.


Jar*_*Par 8

快点.你提到你对象的setter是私有的.如果是这种情况,那么您的对象不是不可变的(否则setter不存在).最好你的对象是只读的.

对于一个真正的不可变对象,别无选择,只能让构造函数接受初始化对象所需的所有值.减少构造函数中参数数量的最佳方法是将值分组为更大的对象,然后将这些对象传递给构造函数.虽然我不会这样做,除非这些值在逻辑上是相关的.

如果你的不可变类型确实需要40个值而且它们不相关,那么最好的方法是使用一个具有40个值的构造函数.那还是进一步打破了大不可变对象.