2016-02-04 2 views
2

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

Вот очень простой пример:

Program.cs

internal class Program 
{ 
    private static void Main(string[] args) 
    { 
     Console.WriteLine("Started application"); 
     Console.ReadKey(); // Stops the application exiting so I can read the output 
    } 
} 

Logging.cs

internal static class Logging 
{ 
    static Logging() 
    { 
     // The checks are all here, for the demo we'll just use WriteLine 
     Console.WriteLine("Logging constructor"); 
    } 
} 

Ожидаемый выход консоли:

запущенное приложение
Logging конструктор < - Эта строка никогда не появляется

Я знаю, что я мог бы создать статический метод внутри Logging класса под названием DoStartupChecks и вызвать его из Main в Program.cs, но я хочу, чтобы понять, что я сделал неправильно здесь. Возможно, ответ заключается в том, чтобы создать метод и вызвать его, но я хочу понять, почему приведенный выше пример неправильный.

+0

Вы уже являетесь участником класса? –

+0

Статический конструктор получает имя при первом использовании класса, а не при загрузке вашей программы. Таким образом, ваш пример действительно не вызовет вызов конструктора. – Mark

+0

Хорошо, что имеет смысл. Я думал, что создание его static создаст экземпляр и, следовательно, вызовет конструктор. Это имеет смысл. Благодарю. – Equalsk

ответ

5

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

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

private static void Main(string[] args) 
{ 
    Logging.DoSomething(); 
    Console.WriteLine("Started application"); 
    Console.ReadKey(); // Stops the application exiting so I can read the output 
} 

From MSDN:

Это [статический конструктор] вызывается автоматически перед первым экземпляром создается или ссылается любые статические члены ,

+0

Так что, я думаю, мне нужен метод в конце концов, и, вызвав метод, он также вызовет вызов конструктора? – Equalsk

+0

Метод, постоянный, свойство, поле ... это может быть что угодно. – HimBromBeere

+0

Прохладный, это имеет смысл для меня. Я по ошибке думал, что сделать его статичным будет достаточно. Благодарю. (Я должен ждать, чтобы согласиться). – Equalsk

Смежные вопросы