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

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

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 ответов


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

MSDN:

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

посмотреть для получения более подробной информации:


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

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

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


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


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


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

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


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


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


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


они упорствуют "для срока службы домена приложения, в котором находится ваша программа" по Microsoft Docs: статические классы и статические члены класса (руководство по программированию на C#).

Читайте также: