С# Статические переменные - область действия и постоянство
Я просто немного экспериментировал:
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.
Как долго сохраняются эти изменения? Продолжительность выполнения программы? Длительность функции, вызывающей статический метод?
Ответы
Ответ 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
Статические переменные относятся к типу, а не к его экземпляру. И обычно (если вы не создаете несколько доменов приложений) объекты типа загружаются только один раз и существуют в течение всего жизненного цикла процесса.