Я читаю код в C#, который использует двух конструкторов. Каждый статичен, и другой общедоступно. Каково различие между этими двумя конструкторами? И для того, что мы должны использовать статических конструкторов?
static
и public
- ортогональные понятия (т.е. они не имеют ничего общего друг с другом).
public
просто означает, что пользователи класса могут вызывать этот конструктор (в отличие, скажем, от private
).
static
означает, что метод (в данном случае конструктор) принадлежит не экземпляру класса, а "самому классу". В частности, статический конструктор вызывается один раз, автоматически, когда класс используется в первый раз.
Более того, статический конструктор нельзя сделать публичным
или приватным
, поскольку его нельзя вызвать вручную; его вызывает только сама среда выполнения .NET - поэтому пометка его как публичного
не будет иметь смысла.
Статический конструктор ... Он гарантированно будет вызываться "один раз" на протяжении всего срока службы приложения / домена приложения. Он может содержать операторы, которые вы хотите выполнить только один раз.
Открытый конструктор ... Поскольку мы не можем добавлять модификаторы доступа к статическому конструктору, открытый конструктор означает, что вы говорите о конструкторе экземпляра. Если конструктор экземпляра является общедоступным, то внешний мир может создавать его экземпляры. Другие варианты: Internal (можно вызвать из библиотеки), Private (только из класса).
Статический конструктор запускается только один раз перед созданием экземпляра вашего класса. Он используется, если вы хотите, чтобы что-то произошло всего один раз. Хорошим примером может служить класс 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.
}