Здравствуйте, Аноним, Вы писали:
А>А>try
А>{
А> CanSomethingDo = false;
А> foo(); // на нее влияет глобальный флаг CanSomethingDo
А>}
А>finally
А>{
А> CanSomethingDo = true;
А>}
А>
А>Хочется короче как-то, ближе к:
А>А>CanSomethingDo = false;
А>foo(); // на нее влияет глобальный флаг CanSomethingDo
А>CanSomethingDo = true;
А>
Ваш код выглядит немного подозрительно. Вы уверены, что флаг CanSomethingDo должен выставляться именно в блоке finally, а не после метода foo? В этом случае, этот флаг станет true даже в случае исключения в методе foo.
Ну, если вам нужно именно это, то наш камрад
_FRED_ у себя в блоге в статейке
"Парные методы" как раз об этом писал. Создаем следующие классы:
public static class Disposable
{
public static IDisposable New(Action dispose) {
return new ActionDisposable(dispose);
}
[Serializable]
[DebuggerDisplay("{ Action != null ? \"<Action>\" : \"<Action (Empty)>\" }")]
private sealed class ActionDisposable : IDisposable
{
public ActionDisposable(Action action) {
Action = action;
}
private Action Action { get; set; }
public void Dispose() {
if(Action != null) {
Action();
Action = null;
}//if
}
}
}
И потом в вашем классе (или там, где лежит ваш флаг), добавляем следующий метод:
public static IDisposable DoSomething() {
CanDoSomething = false;
return Disposable.New(()=>CanDoSomething = true);
}
Использование будет таким:
using (DoSomething())
{
Console.WriteLine("Inside using statement.");
}
Так что С++ идиома RAII присутствует и в C#, просто она немного по другому реализовывается.
@_FRED_