2017-04-25 15 views
0

C#では、スコープの最後にオブジェクトを元の値に復元したいと考えています。 this questionと同様の方法ですが、C#の場合は同じです。C#のスコープで値をバックアップ/復元する方法はありますか?

私はRAIIを使って元の値をバックアップし復元すると考えているブーストのstate_saverを使用することを提案しています。

IDisposableを実装することで、C#でRAIIを取得できます。

これは1回の試みです。 RefObjectを新しい値に設定すると、元の値への参照が失われるだけなので、あまり効果がありません。そしてあなたはPODの上でそれを使うことはできません。

public class State_Saver<T> : IDisposable 
{ 
    public State_Saver(ref T obj, T newValue) 
    { 
     RefObject = obj; 
     m_Backup = RefObject; 

     RefObject = newValue; 
    } 

    public void Dispose() 
    { 
     RefObject = m_Backup; 
    } 

    private T RefObject; 
    private T m_Backup; 
} 

動作しない私は私はTオブジェクトがラッパークラスのいくつかの種類に包まれている要件を追加した場合、それは仕事を得ることができます。しかし、私はクラスを使用している誰かに課したいと思っているよりも少しだけ体重がです。

作品

public class ValueWrapper<T> 
{ 
    public ValueWrapper(T value) 
    { 
     this.Value = value; 
    } 

    public T Value { get; set; } 
} 

public class ScopedBackup<T> : IDisposable 
{ 
    public ScopedBackup(ref ValueWrapper<T> obj, T newValue) 
    { 
     RefObject = obj; 
     m_Backup = RefObject.Value; 

     RefObject.Value = newValue; 
    } 

    public void Dispose() 
    { 
     RefObject.Value = m_Backup; 
    } 

    private ValueWrapper<T> RefObject; 
    private T m_Backup; 
} 

使用法:

ValueWrapper<bool> fred = new ValueWrapper<bool>(true); 

Debug.WriteLine(fred.Value); // writes true 

using (new ScopedBackup<bool>(ref fred, false)) 
{ 
    Debug.WriteLine(fred.Value); // writes false 
} 

Debug.WriteLine(fred.Value); // writes true 

これよりもそれを行うには良い方法はありますか?代わりにラムダを使用usingを使用しての

ティム

+0

フィールドに参照(ref)を格納できないので、もっとうまくいくとは思いません。追加の合併症なしにtry-finallyを使用することがありますか? – Evk

+0

['IEditableObject'](https://msdn.microsoft.com/en-us/library/system.componentmodel.ieditableobject(v = vs.110).aspx)インターフェイスに興味があるかもしれません。それはあなたの問題を解決しませんが、あなたのユースケースにうまく対応しています。 –

答えて

0

感謝。だから、この

ValueWrapper<bool> fred = new ValueWrapper<bool>(true); 

Debug.WriteLine(fred.Value); // writes true 

ScopedBackup.Do<bool>(ref fred, false,()=>{ 

    Debug.WriteLine(fred.Value); // writes false 
}); 

Debug.WriteLine(fred.Value); // writes true 

(コードはラフスケッチですが、私はあなたのアイデアを得る願っています)のようなコードを取得します。これを行う理由は、発信者がオプションのusingを使用しないことを選択できることです。ここには選択肢がありません

関連する問題