这有点奇怪......
假设我有以下类(class):
public class Wibble
{
public string Foo {get;set;}
public string Bar {get;set;}
}
此类用于更新/更改 Foo 和 Bar 的值的过程。但是,在过程中的某个点之后,我想“锁定”实例以防止进行任何更改。所以问题是如何最好地做到这一点?
某种解决方案是这样的:
public class Wibble
{
private string _foo;
private string _bar;
public bool Locked {get; set;}
public string Foo
{
get
{
return this._foo
}
set
{
if (this.Locked)
{
throw new ObjectIsLockedException()
}
this._foo = value;
}
}
public string Bar
{
get
{
return this._bar
}
set
{
if (this.Locked)
{
throw new ObjectIsLockedException()
}
this._bar = value;
}
}
}
然而,这似乎有点不雅。
想要这样做的原因是我有一个应用程序框架,该框架使用使用该类的外部开发的插件。 Wibble 类被传递到插件中,但是其中一些永远不会更改内容,有些可以。这背后的意图是捕捉开发集成问题而不是运行时生产问题。将对象“锁定”允许快速识别未按指定编码的插件。
最佳答案
我已经实现了类似于您的锁定模式的东西,但也有一个由包含实际类数据的私有(private)子类实现的只读接口(interface),这样您就可以传递显然是只读 View 的内容数据并且不能向上转换为原始的“可变版本”。锁定纯粹是为了防止数据提供者在提供不可变 View 后进行进一步更改。
正如您所指出的,它运行良好,但有点笨拙。我认为拥有可变的“Builder”对象然后可以生成不可变的快照实际上更干净。想想 StringBuilder 和 String。这意味着您复制了一些属性代码并且必须编写例程来进行复制,但在我看来,这比在每个属性上都有一个写锁要简单得多。在编译时也很明显,快照应该是只读的,Builder 的用户不能修改它之前创建的快照。
关于c# - 锁定对象以防止任何数据更改,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6139308/