NET Framework 4.8和VB.NET的真正不可变类,具有易于更新的构造函数

xt0899hw  于 2023-01-06  发布在  .NET
关注(0)|答案(1)|浏览(146)

由于不再开发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;
    }
}
hujrc8aj

hujrc8aj1#

如果你不关心“CIC”类的额外分配,你的方法是合理的,并且有维护单个构造函数的优点,如果你以后决定用代码生成这些东西,这也是有利的。
您的目标类是不可变的,因为您可以得到,所以这也很好。
我见过一些实现不变性的奇怪方法,但它们都有一些缺陷和弱点。您的方法根本没有任何可变性,考虑到.NET Framework及其支持的语言级别的限制,这是很好的。
目前我能想到的唯一缺点是

  • 如果目标类和CIC类比一个级别更深,则必须确保其他级别在结构上也是不可变的。
  • 如果序列化需要默认构造函数,则可能会出现问题

相关问题