2011-05-13 15 views
26

que acabo de hacer un pequeño experimento:C# Las variables estáticas - alcance y persistencia

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 me encontré:

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 espera fueron de 0, 3, 0, 10, 0 .

para mi sorpresa, llegué 0, 3, 3, 10, 10.

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

Respuesta

39

Persistirán durante el período de AppDomain. Los cambios realizados a la variable estática son visibles en todos los métodos.

MSDN:

Si una variable local se declara con la palabra clave estática, su vida útil es más larga que el tiempo de ejecución del procedimiento en el que se declara. Si el procedimiento está dentro de un módulo, la variable estática sobrevive siempre que su aplicación continúe ejecutándose.

Ver siguiente para más detalles:

+5

Una variable estática es compartida por todas las instancias de la clase. No solo visible a través de los métodos. –

5

Si se trata de una variable estática, eso significa que existe exactamente un lugar en la memoria durante la duración del programa .

2

Durante la ejecución del programa.

Las variables de clase estática son como las globales. No están conectados a objetos específicos de una clase; solo hay una instancia de esos por programa. Las únicas variables que viven durante el tiempo de ejecución de la función son variables automáticas (locales) de la función.

26

Los resultados que yo esperaba fueron de 0, 3, 0, 10, 0.

Para mi sorpresa, llegué 0, 3, 3, 10, 10.

estoy no estoy seguro de por qué esperaría que la variable estática vuelva a su valor original después de haber sido modificada desde el método Foo (int). Una variable estática persistirá en su valor a lo largo de la vida del proceso y solo existirá una por clase, no instancia.

+1

+1 para distinguir entre variables de clase y variables de instancia. –

+0

Creo que suponía que la parte 'myInt = 0' se evaluaría más de una vez. –

+0

@Chris - él? ¿Estás seguro? ;) – YetAnotherUser

1

Persiste durante la ejecución del programa, o hasta que se sobreescribe con otro valor. Si desea hacer que el resultado sea el que desea, debe especificar myInt = 0 en el constructor antes de devolver myInt;

3

Según la especificación C#, una variable estática se inicializará a más tardar la primera vez que se cargue una clase en un dominio de aplicación, y existirá hasta que se descargue ese dominio de aplicación, generalmente cuando finaliza el programa.

0

Los cambios en el perímetro de estática vivirán siempre y cuando su aplicación

0

Las variables estáticas pertenecen al tipo, no a su instancia. Y generalmente (si no está creando dominios de aplicaciones múltiples), los objetos tipo se cargan solo una vez y existen durante la vida del proceso.

Cuestiones relacionadas