グローバルな値を変更してレジストリ値をそのまま使用して、元の状態に戻しようとすると、私は書くコードに繰り返し問題があります。オブジェクトを作成の逆の順序で廃棄しますか?
私はこの問題を解決するために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で試してみると思っていましたが、他のソリューションのためにすべての耳です。
「デストラクタは設定を元に戻します」ということはどういう意味ですか?ディスポーザブルはデストラクタではなく、どんな場合でも毎回呼び出されます。エラーがない場合でも、毎回設定を元に戻すのはなぜですか?何か不足していますか? –
複数の 'を使用する場合....複数の編集のためにうまくいくでしょう....? –
どのように行っても、元に戻すことが明白でない場合は、多くの混乱とダウンストリームのバグが発生します。 – Marc