Общедоступный конструктор и статический конструктор

Я читаю код в C#, который использует двух конструкторов. Каждый статичен, и другой общедоступно. Каково различие между этими двумя конструкторами? И для того, что мы должны использовать статических конструкторов?

16
задан Konrad Rudolph 8 June 2010 в 07:31
поделиться

3 ответа

static и public - ортогональные понятия (т.е. они не имеют ничего общего друг с другом).

public просто означает, что пользователи класса могут вызывать этот конструктор (в отличие, скажем, от private).

static означает, что метод (в данном случае конструктор) принадлежит не экземпляру класса, а "самому классу". В частности, статический конструктор вызывается один раз, автоматически, когда класс используется в первый раз.

Более того, статический конструктор нельзя сделать публичным или приватным, поскольку его нельзя вызвать вручную; его вызывает только сама среда выполнения .NET - поэтому пометка его как публичного не будет иметь смысла.

31
ответ дан 30 November 2019 в 15:20
поделиться

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

Открытый конструктор ... Поскольку мы не можем добавлять модификаторы доступа к статическому конструктору, открытый конструктор означает, что вы говорите о конструкторе экземпляра. Если конструктор экземпляра является общедоступным, то внешний мир может создавать его экземпляры. Другие варианты: Internal (можно вызвать из библиотеки), Private (только из класса).

3
ответ дан 30 November 2019 в 15:20
поделиться

Статический конструктор запускается только один раз перед созданием экземпляра вашего класса. Он используется, если вы хотите, чтобы что-то произошло всего один раз. Хорошим примером может служить класс Bus (аналогичный тому, что они объясняют в статье MSDN ):

public class Bus
{
    public static int busNo = 0;

    static Bus()
    {
        Console.WriteLine("Woey, it's a new day! Drivers are starting to work.");
    }

    public Bus()
    {
        busNo++;

        Console.WriteLine("Bus #{0} goes from the depot.", busNo);
    }
}


class Program
{
    static void Main(string[] args)
    {
        Bus busOne = new Bus();
        Bus busTwo = new Bus();
    }

    // Output:
    // Woey, it's a new day! Drivers are starting to work.
    // Bus #1 goes from the depot.
    // Bus #2 goes from the depot.
}
24
ответ дан 30 November 2019 в 15:20
поделиться
Другие вопросы по тегам:

Похожие вопросы: