Я узнал это,
Из MSDN:
С# не поддерживает статические локальные переменные (переменные, которые объявлены в области видимости метода).
И здесь:
Модификатор static может использоваться с классами, полями, методами, свойствами, операторами, событиями и конструкторами, но его нельзя использовать с индексаторами, деструкторами или типами, отличными от классов.
То есть локальные переменные не допускаются как статические внутри метода.
Поэтому приведенный ниже код не будет компилироваться
public class Base1
{
public int getHighscoreString()
{
int highscore = Int32.MinValue;
static int max = 10; // It is not allowed here.
if(max>highscore)
highscore = max;
return highscore;
}
}
Но мы всегда можем сделать ту же функциональность
public class Base1
{
static int max = 10;
public int getHighscoreString()
{
int highscore = Int32.MinValue;
if(max>highscore)
highscore = max;
return highscore;
}
}
Итак, является ли это проектным решением, что статическая переменная не может использоваться как локальная переменная внутри метода или по какой-либо причине?
Статическая переменная - это переменная, которая находится за пределами экземпляров класса, в котором она объявлена, в том смысле, что для получения или установки ее значения необходимо вызывать ее тип класса, а не его экземпляры. Это происходит потому, что ссылка на адрес памяти, где хранится статическая переменная, сохраняется независимо от создания или удаления экземпляров этого класса. Скажем, у вас есть класс Zoo
:
public class Zoo
{
public static int counter;
public string Name;
public void AddAnimal(string name)
{
Name = name;
counter++;
}
}
Счетчик увеличивается каждый раз, когда вы добавляете animal
в зоопарк, и вы можете получить общее количество в любое время, позвонив
Zoo myZoo = new Zoo()
myZoo.AddAnimal("tiger");
Zoo.counter; // 1
myZoo.counter // wrong!
Помимо myZoo.counter
, главное отметить, что даже если мы myZoo
экземпляра myZoo
, поле counter
всегда будет содержать общее количество животных в зоопарке!
Напротив, переменные, объявленные в методе, сразу же удаляются после выполнения метода, и поэтому вы не можете ссылаться на них вне этого метода, потому что адрес памяти, где переменная "жила", больше не доступен.
Я надеюсь, что это проясняет этот вопрос немного больше. Ура!