Часто такие переменные используются для поддержки итераторов. В C # они встроены непосредственно в язык через ключевое слово yield
. Вот пример:
IEnumerable<int> TimesTable(int table)
{
for (int i=0 ; i<12 ; i++)
{
yield return i * table;
}
}
В этом примере мы создаем значения в таблице n раз, где вызывающая сторона указывает n. Мы можем использовать это везде, где используется итератор, например, в цикле foreach
:
foreach (var value in TimesTable(3))
{
Console.Write(""+ value + " ");
}
... который производит:
3 6 9 12 15 18 21 24 27 30 33 36
В C ++ для этого могли использоваться статические переменные, подобные тем, которые вы описали в VB (я не VB, поэтому я не знаю синтаксис VB):
int TimesTable(int table) {
static i = 1;
if (i == 12) {
i = 1;
}
return i++ * table;
}
Версия C # лучше, чем эквивалент C ++ (или VB), потому что итератор может быть отменен досрочно, и в любой момент может быть несколько активных итераторов. Эти вещи не верны для версии C ++ без дополнительной работы со стороны разработчика. С другой стороны, это означает, что единственное время, когда статическая переменная действительна в C #, - это время реализации итератора, и значение не сохраняется вне этой области.
Надеюсь, это вам пригодится.