Статические переменные 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#).
Читайте также: