C # Variables estáticas - alcance y persistencia

Acabo de hacer un pequeño experimento:

public abstract class MyClass
{
  private static int myInt = 0;

  public static int Foo()
  {
    return myInt;
  }

  public static int Foo(int n)
  {
    myInt = n;
    return bar();
  }

  private static int bar()
  {
    return myInt;
  }
}

y luego corrí:

MessageBox.Show(MyClass.Foo().ToString());
MessageBox.Show(MyClass.Foo(3).ToString());
MessageBox.Show(MyClass.Foo().ToString());
MessageBox.Show(MyClass.Foo(10).ToString());
MessageBox.Show(MyClass.Foo().ToString());

Los resultados que esperaba eran 0, 3, 0, 10, 0.

Para mi sorpresa, obtuve 0, 3, 3, 10, 10.

¿Por cuánto tiempo persisten estos cambios? La duración de la ejecución del programa? ¿La duración de la función que llama al método estático?

Respuestas a la pregunta(9)

Su respuesta a la pregunta