Ответ 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()
один раз, но эта "локальная переменная", безусловно, живет намного дальше, чем вы ожидали...
Это может или не может быть вам полезно - это зависит от того, что вы делаете. Но большую часть времени на самом деле имеет смысл, чтобы объект имел свое состояние в нормальных полях.