由于不再开发VB .NET和C# for .NET Framework(4.8),因此提供不可变对象功能(如记录)的新的有用语言功能也不可用。
出于特定的目的,我需要在C#库中为对象定义一些尽可能不可变的类,这些对象(也)在VB .NET Office VSTO外接程序解决方案中使用。
我希望有一个不变对象的构造函数,它可以很容易地用我想进入对象的额外数据来扩展。
下面代码中的简单想法/模式是实现这一点的好方法吗?(CIC =构造函数输入类)
任何PersonCIC对象都只用于创建不可变对象。使用Structure作为构造函数的参数,如果它变得大于16个字节,我从Microsoft文档中了解到,效率会降低。
需要使用不可变对象来提供简单且可预测的线程安全性,以利用多线程。目标不是执行正确的OOP,而是应用面向数据编程的思维方式,如定义的here。VB .NET和C# 7.x不是Clojure,但它们是.NET Office VSTO外接程序解决方案的唯一选项。
public sealed class PersonCIC
{
public string name;
public int age;
public string address;
}
public sealed class ImmutablePerson
{
public string name { get; }
public int age { get; }
public string address { get; }
public ImmutablePerson(PersonCIC person)
{
name = person.name;
age = person.age;
address = person.address;
}
}
1条答案
按热度按时间hujrc8aj1#
如果你不关心“CIC”类的额外分配,你的方法是合理的,并且有维护单个构造函数的优点,如果你以后决定用代码生成这些东西,这也是有利的。
您的目标类是不可变的,因为您可以得到,所以这也很好。
我见过一些实现不变性的奇怪方法,但它们都有一些缺陷和弱点。您的方法根本没有任何可变性,考虑到.NET Framework及其支持的语言级别的限制,这是很好的。
目前我能想到的唯一缺点是