2016-05-14 4 views
3

Я в процессе понимания одноэлементного шаблона. Я написал небольшой кусок кода здесьsingleton pattern - создание объекта

Program.cs:

class Program 
{ 
    static void Main(string[] args) 
    { 
     SingleObject objtemp = SingleObject.getInstance();\ 
     objtemp.showMessage(); 
    } 
} 

SingleObject.cs

class SingleObject 
{ 
    static SingleObject obj = new SingleObject(); 

    private SingleObject() 
    { 
    } 

    public static SingleObject getInstance() 
    { 
     return obj; 
    } 

    public void showMessage() 
    { 
     Console.WriteLine("Hello Message"); 
    } 
} 

Я не в состоянии понять, что на самом деле называть SingleObject() конструктор? Когда я вызываю метод getInstance(), он возвращает экземпляр правильно?

+2

Лучший способ попасть в шаблон Singleton - прочитать эту тему: http://csharpindepth.com/Articles/General/Singleton.aspx –

+0

Статические элементы автоматически инициализируются при первом использовании/прикосновении/доступе статический класс. – Chris

+0

static SingleObject obj = new SingleObject(); // это поле. Инициализация поля (определенная реализация) * иногда * перед использованием класса - средой выполнения. edit: Я считаю, что это может иметь проблемы (вызов конструктора из инициализатора поля) - конструктор может предположить, что все поля были инициализированы, но это не будет иметь место, если у вас есть больше полей для инициализации после «obj» - они инициализируются в том порядке, в котором они объявлены. – ABuckau

ответ

0

Основная идея заключается в том, что Your're делает конструктор закрытым. Таким образом, вы не можете инициализировать объект SingleObject извне. Но статический объект, который вы создаете внутри самого класса, может использовать частный конструктор, позволяя вам получить доступ к нему извне с помощью общедоступного метода.

0
static SingleObject obj = new SingleObject(); 

Здесь вы делаете этот экземпляр. Он будет вызываться перед первым использованием. Подробнее здесь When do static variables get initialized in C#?