【发布时间】:2011-05-26 13:31:53
【问题描述】:
这有点奇怪……
假设我有以下课程:
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 类被传递到插件中,但是其中一些永远不应该更改内容,其中一些可以。这背后的目的是捕捉开发集成问题,而不是运行时生产问题。将对象“锁定”允许快速识别未按指定编码的插件。
【问题讨论】:
-
这让我想起了 Eric Lippert 所说的“冰棒不变性”。请参阅:blogs.msdn.com/b/ericlippert/archive/2011/05/23/… 和 blogs.msdn.com/b/ericlippert/archive/2007/11/13/…
-
我问了一个类似的问题,Lippert 先生很好地描述了一些需要注意的陷阱。我还发布了一个我最终使用的示例。 stackoverflow.com/questions/4168382/…
标签: c#