Подтвердить что ты не робот

С# Статические переменные - область действия и постоянство

Я просто немного экспериментировал:

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.

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

4b9b3361

Ответ 1

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

MSDN:

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

Смотрите следующие для более подробной информации:

Ответ 2

Ожидаемые результаты: 0, 3, 0, 10, 0.

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

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

Ответ 3

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

Ответ 4

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

Ответ 5

В течение всего времени выполнения программы.

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

Ответ 6

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

Ответ 7

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

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

Ответ 8

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

Ответ 9

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