我在编写的代码中遇到一个反复出现的问题:修改某些全局值(我将使用注册表值作为示例),然后尝试将修改恢复到原始状态。
我想我会尝试使用 IDisposable 来解决这个问题。创建时,该对象将读取注册表值,将其存储在本地,然后对其进行修改。当被破坏时,它会恢复设置。它会像这样使用:
using(RegistryModification mod = new RegistryModification("HKCR\SomeValue", 42))
{
// reg value now modified to 42, do stuff
} // Object gets disposed, which contains code to revert back the setting
如果只进行 1 处修改,应该可以很好地工作。但是,如果进行了多次修改,或者调用者没有使用“using”构造创建对象,我可以看到出现问题。
public void Foo()
{
// assume HKCR\SomeValue starts as '13'
// First object reads HKCR\SomeValue and stores '13', then modifies to 42
RegistryModification mod1 = new RegistryModification("HKCR\SomeValue", 42);
// Next object reads HKCR\SomeValue and stores '42', then modifies to 12
RegistryModification mod2 = new RegistryModification("HKCR\SomeValue", 12);
}
// objects are destroyed. But if mod1 was destroyed first, followed by mod2,
// the reg value is set to 42 and not 13. Bad!!!
如果调用者手动处置该对象,问题会变得更糟。这让我认为我的方法是有缺陷的。
是否有某种公认的模式来解决这个问题?我在想向类添加静态堆栈可能会有所帮助。
是否以某种方式保证对象被销毁的顺序?我想我会尝试使用 IDisposable,但我正在倾听其他解决方案。