有没有办法在c#中跨作用域备份/恢复值?

时间:2017-04-25 16:33:15

标签: c#

在C#中,我希望能够在范围的末尾将对象恢复为其原始值。与this question类似,但对于C#。

关于该问题的一个答案建议使用boost state_saver我相信使用RAII来备份和恢复原始值。

您可以通过实施IDisposable来获取c#中的RAII。

这是一次尝试。它不是很有效,因为当您将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对象被包装在某种Wrapper类中,可以让它工作。但它比我想要强加给使用该课程的某人重量更多

作品

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

有没有比这更好的方法?

由于

1 个答案:

答案 0 :(得分:0)

而不是使用NewTimer()使用lambda。所以你得到这样的代码

using

(代码是草图,但我希望你能得到这个想法)。这样做的原因是调用者可以选择不使用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 ,它是可选的。这里别无选择