Частная статика VB6 в C #? - PullRequest
5 голосов
/ 01 мая 2010

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

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

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

Ответы [ 4 ]

6 голосов
/ 01 мая 2010

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

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();
    }
}
0 голосов
/ 01 мая 2010

Часто такие переменные используются для поддержки итераторов. В 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 голосов
/ 01 мая 2010

Я помню статический приват в visual basic. Они были круты для какой-то конкретной задачи.

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

0 голосов
/ 01 мая 2010

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

class C
{
  static int x=0;

  void count()
  {
    ++x; // this x gets incremented as you want 
  }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...