Существует ли в C # ключевое слово, которое сохранит локальные переменные при нескольких вызовах? - PullRequest
11 голосов
/ 15 декабря 2011

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

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

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

Ответы [ 3 ]

17 голосов
/ 15 декабря 2011

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

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

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() только один раз, но эта "локальная переменная" определенно живет намного дольше, чем вы могли ожидать ...

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

1 голос
/ 15 декабря 2011

Вы должны создать статическую переменную или переменную-член экземпляра класса, в котором находится метод.

0 голосов
/ 15 декабря 2011
public class Foo
{
    static int _bar = 1;

    public int Bar()
    {
        return ++_bar;
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...