c# – 静态不可变的默认实例

我希望能够为可以使用的类提供默认值,但问题是如果它们被更改,那么它将影响对它的所有引用,并且不会是“默认”.通过使用诸如此类的默认值,它可以保存在内存中,并且允许默认值(如果需要)传播到使用默认值的所有引用.

一个简单的例子是

class A
{
    static public A Default;
}

然后可以使用A.Default作为A的“默认”实例.再次,问题是A不是不可变的或至少“冻结”,并且对它的更改将改变所有引用.如果这是您想要的行为,但如果默认情况发生意外更改,则可能会造成严重破坏.

我真正需要的是一种深度冻结和解冻Default的方法.

显然,一种方法是简单地将所有设置器设置为条件并将集合标记为只读.提供这种简单的行为似乎需要做很多重复工作.

是否有简单的库,模式或反射来实现这一目标?写入时复制功能会很好,因此如果尝试更改Default,则会创建一个新的可变实例.不仅如此,如果它有机会提高性能(更改的大小),甚至可以创建一个flyweight实例.

示例:假设您最初创建具有所有相同状态的1M大(内存大小)对象.通过使用默认模式,这将只创建1个实际对象.假设您为所有状态(比如位置)更改了1个参数,但对象本身非常大.使用flyweight模式,您将只有1M更改的参数来跟踪(较慢但较少的内存),而不是1M新对象.在更改了足够的参数后,最终将完整的对象分配给它的参考.

有这样的东西吗?

最佳答案 我使用的一种可能方法是实现只读接口并将静态Default返回类型更改为:

interface ISomeClass
{
    string MyProperty { get; }
}

class SomeClass : ISomeClass
{
    string MyProperty { get; set; }

    public static ISomeClass Default = new SomeClass(); 
}

然后,您可以强制执行任何需要对Default的更改,这是一个可变引用
是明确请求的,可能是通过单独的方法:

        public static SomeClass GetMutableDefault()
        {
            return Default as SomeClass;
        }

然后,您将获得编译时检查,尝试更改SomeClass实例的任何方法都不使用Default,除非它明确说明.

点赞