2016-06-15 2 views
4

Согласно MSDN-х design guide for constructors,C# Конструктор - почему конструктор по умолчанию генерируется компилятором только если нет конструктора, а когда нет конструктора по умолчанию не

«Если вы явно не объявлять никаких конструкторов на тип, многие языки (например, C#) автоматически добавят публичный конструктор по умолчанию . (Абстрактные классы получают защищенный конструктор.) Добавление параметризованного конструктора в класс запрещает компилятору добавлять конструктор по умолчанию. вызывает случайные нарушения. "

Почему нет:

«Если вы явно не объявлять любой по умолчанию конструкторов о типе многие языки (например, C#) будут автоматически добавлять открытый конструктора по умолчанию . (Абстрактные классы получают защищенный конструктор.) «

В чем причина этого?

+0

Обратите внимание, что термин «конструктор по умолчанию» применяется только к тому, который добавляет компилятор C#. Если вы добавляете конструктор без параметров, это * не * конструктор по умолчанию. –

+0

Это та же самая причина 'private' существует: она отнимает от пользователей API опасные и нежелательные варианты. 'private' строго не нужен для функционирования языка. Он принимает только варианты. – usr

+0

Возможный дубликат [Должен ли мы всегда включать конструктор по умолчанию в класс?] (Http://stackoverflow.com/questions/3692042/should-we-always-include-a-default-constructor-in-the-class) – Igoranze

ответ

12

Потому что не все классы должны быть сконструированы без параметров.

Рассмотрите класс, предназначенный для реализации интерфейса между вашим приложением и файлом на диске. Было бы очень неудобно обрабатывать случай, когда объект строится без указания файла для управления.

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

Как только вы начинаете добавлять конструкторы вообще, тогда автоматика отключена и конструктор по умолчанию не будет предоставлен.

6

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

class Customer 
{ 
    public Customer(string name) { this.Name = name; } 
    public string Name { get; } 
} 

Если компилятор также добавил public Customer(), то вы можете обойти требование для инициализации клиента с именем.

2

Если конструктор отсутствует, нет возможности обновить экземпляр класса.

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

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

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

public class Foo 
{ 

    private readonly IDbConnection _dbConnection; 

    public Foo(IDbConnection dbConnection) 
    { 
     if (dbConnection == null) 
      throw new ArgumentNullException(nameof(dbConnection)); 

     _dbConnection = dbConnection; 
    } 

    public Whatever Get() 
    { 
     var thingyRaw = _dbConnection.GetStuff(); 
     var thingy = null; // pretend some transformation occurred on thingyRaw to get thingy 
     return thingy; 
    } 

} 

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

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