Частные помехи VB6 в C#?

В VB6 существуют локальные статические переменные, которые сохраняют их значения после выхода процедуры. Это похоже на использующий общедоступный Вар, но на локальном блоке. Например:

sub count()
static x as integer
x = x + 1
end sub

После 10 вызовов x будет 10. Я пытался искать то же самое в.NET (и даже Java), но не было ни одного. Почему? Это повреждает модель OOP в некотором роде и является там способом эмулировать это.

5
задан blez 30 April 2010 в 22:23
поделиться

4 ответа

Самое близкое, что вы можете получить, это статическое поле вне метода:

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();
    }
}
6
ответ дан 14 December 2019 в 13:30
поделиться

Вы всегда можете использовать статические переменные в класс для этой цели:

class C
{
  static int x=0;

  void count()
  {
    ++x; // this x gets incremented as you want 
  }
}
0
ответ дан 14 December 2019 в 13:30
поделиться

Часто такие переменные используются для поддержки итераторов. В 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 # только во время реализации итератора, и значение не сохраняется за пределами этой области.

Надеюсь, это будет вам полезно.

0
ответ дан 14 December 2019 в 13:30
поделиться

Я помню static private в Visual Basic. Они были круты для какой-то конкретной задачи.

В .NET такого нет. Вам придется придерживаться статики вне метода.

0
ответ дан 14 December 2019 в 13:30
поделиться