Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/lua/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何以不变的方式实现缓存?_C#_Immutability - Fatal编程技术网

C# 如何以不变的方式实现缓存?

C# 如何以不变的方式实现缓存?,c#,immutability,C#,Immutability,我读过很多书,也读过很多关于它的好东西,所以我决定在我的一个爱好项目中尝试一下。我将所有字段声明为只读,并创建了所有通常会改变对象以返回新的修改版本的方法 它工作得很好,直到我遇到这样一种情况:一个方法应该,通过外部协议,在不修改对象的情况下,返回关于对象的特定信息,但同时可以通过修改内部结构进行优化。特别是,这种情况在一个特定的环境中发生 当用户调用intfind(intn)时,对象对外人来说似乎没有修改。它在概念上表示同一个实体,但它的内部字段经过变异以优化运行时间 如何以不变的方式实现这一

我读过很多书,也读过很多关于它的好东西,所以我决定在我的一个爱好项目中尝试一下。我将所有字段声明为只读,并创建了所有通常会改变对象以返回新的修改版本的方法

它工作得很好,直到我遇到这样一种情况:一个方法应该,通过外部协议,在不修改对象的情况下,返回关于对象的特定信息,但同时可以通过修改内部结构进行优化。特别是,这种情况在一个特定的环境中发生

当用户调用
intfind(intn)
时,对象对外人来说似乎没有修改。它在概念上表示同一个实体,但它的内部字段经过变异以优化运行时间


如何以不变的方式实现这一点?

简短回答:您必须自己确保线程安全

字段上的
readonly
关键字可确保在构建包含此字段的对象后无法修改该字段。 因此,此字段的唯一写操作包含在构造函数中(或字段初始化中),并且在构造对象之前,无法通过方法调用进行读取,因此
readonly
的线程安全性

如果您想要实现缓存,您就打破了只发生一次写入的假设(因为“缓存写入”可以并且将在读取期间发生),因此在坏的情况下可能会出现线程问题(假设您正在从文件中读取行,两个线程可以使用相同的参数调用find方法,但读取两行不同的行,因此得到不同的结果)。
您想要实现的是。这可能会帮您提供一个优雅的答案。

我想说,如果您以线程安全的方式进行突变,而它是外人无法检测到的,那么它可以被认为是不可变的。@Joe但这样我就必须自己维护线程安全。不可变的美妙之处,正如我所理解的,是我只需指定readonly关键字即可将其留给语言。但您说过要对其进行变异。如果您不以线程安全的方式执行此操作,您将失去不可变类型(线程安全)的一个好处。我可以想象一个解决方案,其中您的类具有惰性计算属性(可能使用
惰性
)这实现了您的优化。Chris Okasaki有一本书《功能数据结构》,也许它可以帮助您(如果您还没有读过的话)。