Статический как локальная переменная внутри функции в C #

2

Я узнал это,

Из 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;

        }
    }

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

  • 1
    CLR поддерживает его, так как это особенность VB.NET, но команда разработчиков C # решила не поддерживать эту функцию. Так что да, это дизайнерское решение.
  • 0
    а какой будет точка статической локальной переменной?
Теги:

1 ответ

0

Статическая переменная - это переменная, которая находится за пределами экземпляров класса, в котором она объявлена, в том смысле, что для получения или установки ее значения необходимо вызывать ее тип класса, а не его экземпляры. Это происходит потому, что ссылка на адрес памяти, где хранится статическая переменная, сохраняется независимо от создания или удаления экземпляров этого класса. Скажем, у вас есть класс 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 всегда будет содержать общее количество животных в зоопарке!

Напротив, переменные, объявленные в методе, сразу же удаляются после выполнения метода, и поэтому вы не можете ссылаться на них вне этого метода, потому что адрес памяти, где переменная "жила", больше не доступен.

Я надеюсь, что это проясняет этот вопрос немного больше. Ура!

  • 0
    Да, конечно, это проясняет вопрос. Не могли бы вы объяснить, как это поддерживают другие языки (VB, C ++), какой в этом смысл?
  • 1
    Это не отвечает на вопрос ОП вообще. Это как если бы кто-то спросил, не могли бы вы объяснить, почему против вакцин не делают прививки, и ваш ответ «вакцины предотвращают болезнь».
Показать ещё 2 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню