Es bastante común en programación, querer cambiar el valor de una variable temporalmente. Algo tipo:

int variable;

int oldValue = variable;
variable = newValue;
{
   ...
}
variable = oldValue;

Y aún así, este código no es del todo correcto. La forma correcta sería:

int variable;

int oldValue = variable;
variable = newValue;
try
{
    ...
}
finally
{
    variable = oldValue;
}

Tras enfrentarme a este problema muchas veces, acabé montando una forma sencilla mediante callbacks muy cómodo con funciones anónimas.

El código anterior lo puedo convertir en (que es mucho mejor porque variable y newVariable aparecen una única vez y no hay que crear variables temporales manualmente y el código es más limpio):

Scopable.RefScope(ref variable, newValue, () =>
{
    ...
});

He aquí la implementación genérica de RefScope para que cualquiera pueda utilizarlo en su código:

static public void RefScope<TType>(ref TType Variable, TType VariableNewValue, Action Action)
{
 var VariableOldValue = Variable;
 Variable = VariableNewValue;
 try
 {
  Action();
 }
 finally
 {
  Variable = VariableOldValue;
 }
}