在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
有没有比这更好的方法?
由于
添
答案 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
,它是可选的。这里别无选择