2013-03-27 4 views

ответ

17

Какой смысл в оставляя их пустыми?

Существует множество причин для создания «пустых» конструкторов.

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

Вы можете создать пустой статический конструктор, потому что это меняет семантику инициализаторов статического поля. Прочтите Jon's article on the subject.

Оставим статические конструкторы и рассмотрим пустые конструкторы экземпляров.

Ключевое правило, которое мотивирует пустые конструкторы: По умолчанию, если в типе нет конструкторов, вы получаете бесплатный пустой конструктор без параметров. Если в типе есть какие-либо конструкторы, вы не получаете бесплатный пустой конструктор без параметров.

Итак, первая очевидная причина, по которой вам нужен пустой конструктор: Я хочу пустой конструктор без параметров, но я уже сделал еще один ctor, поэтому я больше не получаю его бесплатно.

Вторая причина заключается в том, что у вас нет каких-либо ctors, и вы не хотите пустую без параметров public constructor. Вам может понадобиться пустой безпараметрический закрытый, внутренний или защищенный конструктор. Если это то, чего вы хотите, тогда вам придется сделать это самостоятельно.

В частности, создание пустого частного ctor как единственного ctor означает, что класс не может быть создан через конструктор извне класса. Это очень полезно, если вы хотите использовать шаблон фабрики. Он также предотвращает создание кода вне класса для производных классов, потому что производные классы должны иметь возможность вызвать конструктор.Если все конструкторы являются частными, то они не могут быть получены.

Я часто использую этот вариант по образцу фабрики:

public abstract class Thing 
{ 
    private Thing() {} 
    private class RedThing : Thing { ... } 
    public static Thing GetRedThing() { return new RedThing(); } 
} 

Престол, делая приватный конструктор, я могу сделать публичный абстрактный класс, который может быть инстанцированным только моим кодом и только продолженная мой код, и поэтому у меня есть хороший инвариант: каждый раз, когда я вижу объект типа Thing, я знаю, откуда он.

+0

Спасибо, я не был уверен, что наличие частного конструктора остановит класс от получения конструктора _default_ ... – Lucas

+0

@Lucas: Если класс имеет какой-либо конструктор экземпляра в исходном коде, то он не получает конструктор по умолчанию. –

+1

@IlyaIvanov: Дело в том, что оно предотвращает вывод *, за исключением вложенных классов *. «Реферат» избыточен; это просто, чтобы сделать код более самодокументированным. –

2

Статические конструкторы бывают когда-то, когда класс загружается, частные конструкторы происходят, когда их вызывают некоторые общедоступные статические методы, обычно используемые для создания синглетонов или с помощью шаблона Builder. Нет причин иметь пустой частный конструктор (который я знаю).

+4

Существует несколько причин, чтобы иметь пустой частный ctor. –

+0

@EricLippert, не могли бы вы перечислить один или два. Я искренне заинтересован ... – Lucas

+0

См. Мой ответ для некоторых примеров. –

1

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

public class MyClass { 

    private static int staticitem; 
    private int instanceitem; 

    static MyClass(){ 
     staticitem = 0; //define value for staticitem 
    } 

    private MyClass() { //can only be called from within the class 
     instanceitem = 0; //define value for instanceitem 
    } 

    public static MyClass GetMyClass() { 
     MyClass m = new MyClass(); 
     return m; 
    }  

} 
1

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

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

Вы можете использовать оба способа, например, для создания шаблона Singleton.

Проверьте следующий код:

public class Singleton 
{ 
    public static Singleton Instance; 
    static Singleton 
    { 
     Instance = new Singleton(); 
    } 
    private Singleton() 
    { 
    } 
} 

public class SomeOtherClass 
{ 
    public static Singleton CompileError = new Singleton(); 
    public static Singleton CompileOK = Singleton.Instance; 
} 
+0

Это правда? Если у вас есть пустой частный конструктор и не пустой публичный конструктор, будет ли он необразован? – Lucas

+0

"ничем другим, кроме самого себя". Должна быть более конкретной. –

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