C # Статические переменные - объем и постоянство - PullRequest
33 голосов
/ 13 мая 2011

Я только что провел небольшой эксперимент:

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;
  }
}

, а затем побежал:

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());

Результаты, которые я ожидал, были 0, 3, 0, 10, 0.

К моему удивлению, я получил 0, 3, 3, 10, 10.

Как долго эти изменения сохраняются?Продолжительность выполнения программы?Продолжительность функции, вызывающей статический метод?

Ответы [ 9 ]

46 голосов
/ 13 мая 2011

Они будут сохраняться в течение AppDomain .Изменения, внесенные в статическую переменную, видны во всех методах.

MSDN:

Если локальная переменная объявлена ​​с ключевым словом Static, ее время жизни больше, чем время выполнения процедуры, в которой она объявлена,Если процедура находится внутри модуля, статическая переменная сохраняется до тех пор, пока ваше приложение продолжает работать.

Подробнее см. Ниже:

27 голосов
/ 13 мая 2011

Результаты, которые я ожидал, были 0, 3, 0, 10, 0.

К моему удивлению, я получил 0, 3, 3, 10, 10.

Я не уверен, почему вы ожидаете, что статическая переменная вернется к своему первоначальному значению после изменения из метода Foo (int).Статическая переменная будет сохранять свое значение в течение всего жизненного цикла процесса, и в каждом классе будет существовать только одна, а не экземпляр.

7 голосов
/ 13 мая 2011

Если это статическая переменная, это означает, что она существует ровно в одном месте в памяти на время действия программы.

5 голосов
/ 13 мая 2011

В соответствии со спецификацией C #, статическая переменная будет инициализирована не позднее, чем в первый раз, когда класс загружается в AppDomain, и будет существовать до тех пор, пока этот AppDomain не будет выгружен - обычно, когда программа завершается.

4 голосов
/ 13 мая 2011

На время выполнения программы.

Статические переменные класса похожи на глобальные.Они не связаны с определенными объектами класса - есть только один экземпляр тех на программу.Единственные переменные, которые живут во время выполнения функции, являются автоматическими (локальными) переменными функции.

1 голос
/ 13 марта 2018

Они сохраняют значение « на протяжении всего жизненного цикла домена приложения, в котором находится ваша программа » в соответствии с Документы Microsoft: статические классы и члены статических классов (Руководство по программированию в C #) .

Смотри также:

1 голос
/ 13 мая 2011

Он сохраняется на время выполнения программы или до тех пор, пока вы не перезапишите его другим значением. Если вы хотите, чтобы результат был таким, какой вы хотите, вы должны указать myInt = 0 в конструкторе, прежде чем вернуть myInt;

0 голосов
/ 13 мая 2011

Статические переменные принадлежат типу, а не его экземпляру.И обычно (если вы не создаете несколько доменов приложений) объекты типа загружаются только один раз и существуют в течение всего жизненного цикла процесса.

0 голосов
/ 13 мая 2011

Ваши изменения в статической области действия будут существовать до тех пор, пока ваше приложение

...