Существует ли ключевое слово в С#, которое заставляет локальные переменные сохраняться при нескольких вызовах?

То есть, в C, мы можем определить такую ​​функцию, как:

func(){   
  static int foo = 1;   
  foo++;  
  return foo;  
}

и он будет возвращать большее число при каждом вызове. Есть ли эквивалентное ключевое слово в С#?

Ответ 1

Нет, в С# нет такой вещи. Все состояния, которые вы хотите сохранить в нескольких вызовах методов, должны быть в полях, будь то экземпляры или статические.

Кроме того, если вы захватили переменную в выражении лямбда или что-то в этом роде. Например:

public Func<int> GetCounter()
{
    int count = 0;

    return () => count++;
}

Теперь вы можете использовать:

Func<int> counter = GetCounter();
Console.WriteLine(counter()); // Prints 0
Console.WriteLine(counter()); // Prints 1
Console.WriteLine(counter()); // Prints 2
Console.WriteLine(counter()); // Prints 3

Теперь, конечно, вы вызываете только GetCounter() один раз, но эта "локальная переменная", безусловно, живет намного дальше, чем вы ожидали...

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

Ответ 2

Вам нужно будет создать переменную класса static или instance класса, в котором находится метод.

Ответ 3

public class Foo
{
    static int _bar = 1;

    public int Bar()
    {
        return ++_bar;
    }
}