我在编写的代码中遇到了一个反复出现的问题:修改一些全局值(我将使用注册表值作为示例),然后尝试将修改恢复为原始状态。
我想我会尝试使用 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 次修改,应该会很好用。但是,如果进行了多次修改,或者调用者没有使用“使用”构造创建对象,我会看到出现问题。
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,但我对其他解决方案全心全意。