В VB6 существуют локальные статические переменные, которые сохраняют их значения после выхода процедуры. Это похоже на использующий общедоступный Вар, но на локальном блоке. Например:
sub count()
static x as integer
x = x + 1
end sub
После 10 вызовов x будет 10. Я пытался искать то же самое в.NET (и даже Java), но не было ни одного. Почему? Это повреждает модель OOP в некотором роде и является там способом эмулировать это.
Самое близкое, что вы можете получить, это статическое поле вне метода:
private static int x;
public [static] void Foo() {
x++;
}
Пример закрытия по запросу:
using System;
class Program {
private static readonly Action incrementCount;
private static readonly Func<int> getCount;
static Program() {
int x = 0;
incrementCount = () => x++;
getCount = () => x;
}
public void Foo() {
incrementCount();
incrementCount();
Console.WriteLine(getCount());
}
static void Main() {
// show it working from an instance
new Program().Foo();
}
}
Вы всегда можете использовать статические переменные в класс для этой цели:
class C
{
static int x=0;
void count()
{
++x; // this x gets incremented as you want
}
}
Часто такие переменные используются для поддержки итераторов. В 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 # только во время реализации итератора, и значение не сохраняется за пределами этой области.
Надеюсь, это будет вам полезно.
Я помню static private в Visual Basic. Они были круты для какой-то конкретной задачи.
В .NET такого нет. Вам придется придерживаться статики вне метода.