gpt4 book ai didi

c# - 静态不可变默认实例

转载 作者:行者123 更新时间:2023-11-30 12:35:36 26 4
gpt4 key购买 nike

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

一个简单的例子是

class A
{
static public A Default;
}

然后可以使用 A.Default 作为 A 的“默认”实例。同样,问题是 A 不是不可变的,或者至少不是“卡住”的,对它的更改将更改所有引用。如果那是您想要的行为,这可能很好,但如果默认设置被意外更改,可能会造成严重破坏。

我真正需要的是一种深度卡住和解冻 Default 的方法。

显然,一种方法是简单地让所有 setter 仅在一个条件下设置并将集合标记为只读。提供如此简单的行为似乎需要大量重复性工作。

是否有简单的库、模式或反射来完成此任务? Copy-on-write 能力会很好,这样如果 Default 被尝试改变,一个新的可变实例将被创建。不仅如此,如果有机会提高性能(更改大小),甚至可以创建享元实例。

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

有这样的吗?

最佳答案

我使用的一种可能的方法是实现一个只读接口(interface)并将静态默认返回类型更改为:

interface ISomeClass
{
string MyProperty { get; }
}

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

public static ISomeClass Default = new SomeClass();
}

然后您可以强制要求任何时候更改默认值,一个可变引用明确要求,可能通过单独的方法:

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

然后您将在编译时检查任何试图更改 SomeClass 实例的方法是否未使用默认值,除非它明确说明。

关于c# - 静态不可变默认实例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5211489/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com