C# 模式块将变量设置为开始值,做一些工作并使用结束值重置变量
C# pattern block to set a variable to a begin value, do some work and reset variable with a end value
我正在尝试优化以下工作流程:
myObj.SupressEvents = true;
DoSomeWork();
DoSomeMoreWork();
...
myObj.SupressEvents = false;
这个问题很明显,两者之间可能会遗漏 myObj.SupressEvents = true/false;
并导致不必要的错误,或者只是使用 return 可以使重置为 false 永远无法达到,我我正在寻找一种避免忘记它的模式,例如:
// This is a keyword example, not a function call nor definition
SetAndReset(myObj.SupressEvents, true, false)
{
DoSomeWork();
DoSomeMoreWork();
...
}
我想这可以通过委托或带有 Func 的函数来完成,但是即使我在两者之间执行 return 它也能正常工作吗,无论如何它都会将变量重置为 false?
本机 C# 关键字中有类似的东西吗?
您可以声明一个采用 Action
的方法(您想要完成的工作)并将调用包装在该方法中:
void Wrap(Action action, object myObj /* Replace with actual type, or remove parameter if field in class */)
{
myObj.SupressEvents = true;
action.Invoke();
myObj.SupressEvents = false;
}
您可以这样调用方法:
Wrap(() =>
{
DoSomeWork();
DoSomeMoreWork();
});
作为对@Hayden 解决方案的改进,我喜欢 post 防弹版本,它还处理可能发生的异常并破坏变量的状态:
public void SuppressRebuildPropertiesWork(Action action)
{
SuppressRebuildPropertiesWork(() =>
{
action.Invoke();
return true;
});
}
public bool SuppressRebuildPropertiesWork(Func<bool> action)
{
bool result;
try
{
SuppressRebuildProperties = true;
result = action.Invoke();
}
catch (Exception e)
{
Debug.WriteLine(e);
throw;
}
finally
{
SuppressRebuildProperties = false;
}
return result;
}
我正在尝试优化以下工作流程:
myObj.SupressEvents = true;
DoSomeWork();
DoSomeMoreWork();
...
myObj.SupressEvents = false;
这个问题很明显,两者之间可能会遗漏 myObj.SupressEvents = true/false;
并导致不必要的错误,或者只是使用 return 可以使重置为 false 永远无法达到,我我正在寻找一种避免忘记它的模式,例如:
// This is a keyword example, not a function call nor definition
SetAndReset(myObj.SupressEvents, true, false)
{
DoSomeWork();
DoSomeMoreWork();
...
}
我想这可以通过委托或带有 Func 的函数来完成,但是即使我在两者之间执行 return 它也能正常工作吗,无论如何它都会将变量重置为 false? 本机 C# 关键字中有类似的东西吗?
您可以声明一个采用 Action
的方法(您想要完成的工作)并将调用包装在该方法中:
void Wrap(Action action, object myObj /* Replace with actual type, or remove parameter if field in class */)
{
myObj.SupressEvents = true;
action.Invoke();
myObj.SupressEvents = false;
}
您可以这样调用方法:
Wrap(() =>
{
DoSomeWork();
DoSomeMoreWork();
});
作为对@Hayden 解决方案的改进,我喜欢 post 防弹版本,它还处理可能发生的异常并破坏变量的状态:
public void SuppressRebuildPropertiesWork(Action action)
{
SuppressRebuildPropertiesWork(() =>
{
action.Invoke();
return true;
});
}
public bool SuppressRebuildPropertiesWork(Func<bool> action)
{
bool result;
try
{
SuppressRebuildProperties = true;
result = action.Invoke();
}
catch (Exception e)
{
Debug.WriteLine(e);
throw;
}
finally
{
SuppressRebuildProperties = false;
}
return result;
}