Когда в моем классе есть поле static:

public static int Counter = 0;

С конструктором static:

static Class() { 
    Counter++; 
}

Когда я создаю объект этого класса и проверяю Class.Counter, он показывает мне 1, что является правильным.

Но когда я создаю другой объект того же класса, Class.Counter остается 1.

Почему это?

-4
krzysztof 30 Апр 2014 в 19:07

3 ответа

Лучший ответ

Потому что статический конструктор выполняется только один раз.

Из Спецификации C #:

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

  • Создается экземпляр класса.
  • Ссылка на любой из статических членов класса.
11
Community 20 Июн 2020 в 09:12

Это потому, что вы увеличиваете свой счетчик в статическом конструкторе, и он будет выполнен только один раз.

статический конструктор C # - MSDN

Статический конструктор используется для инициализации любых статических данных или для выполнить определенное действие, которое необходимо выполнить только один раз . Он вызывается автоматически перед созданием первого экземпляра или любого другого ссылаются на статические члены.

Вы можете исправить это, увеличивая конструктор экземпляра, например:

class Class
{
    public static int counter = 0;

    public Class()
    {
        counter++;
    }
}

Для обеспечения безопасности потоков используйте Interlocked.Increment(ref counter); вместо counter++

1
Habib 30 Апр 2014 в 15:14

У Selman22 все правильно, вот еще немного подробностей:

Из MSDN

Статический конструктор используется для инициализации любых статических данных или для выполнения определенного действия, которое необходимо выполнить только один раз. Он вызывается автоматически перед созданием первого экземпляра или перед ссылками на статические члены.

Статические конструкторы обладают следующими свойствами:

  • Статический конструктор не принимает модификаторы доступа и не имеет параметров.
  • Статический конструктор вызывается автоматически для инициализации класса перед созданием первого экземпляра или ссылками на любые статические члены.
  • Статический конструктор нельзя вызвать напрямую.
  • Пользователь не может контролировать, когда статический конструктор выполняется в программе.
  • Типичное использование статических конструкторов - это когда класс использует файл журнала, а конструктор используется для записи записей в этот файл.
  • Статические конструкторы также полезны при создании классов-оболочек для неуправляемого кода, когда конструктор может вызывать метод LoadLibrary.

Если статический конструктор генерирует исключение, среда выполнения не вызовет его второй раз, и тип останется неинициализированным в течение всего времени существования домена приложения, в котором выполняется ваша программа.

Ссылочный URL: http://msdn.microsoft.com/en-us/library/ k9x6w0hc.aspx

0
Pseudonym 30 Апр 2014 в 15:12