цепочка конструкторов c # / конструктор по умолчанию

#c# #class #constructor #chaining

#c# #класс #конструктор #цепочка

Вопрос:

Новичок в программировании и задавался вопросом, не лучше ли объявить конструктор по умолчанию на C # в вашем коде, хотя я думаю, что C # сделает это за вас. Например, какова цель следующего открытого конструктора без операторов. Следующий пример — это то, чему я следую, но на самом деле не понимаю, почему два класса конструкторов OperationResult связаны цепочкой? Зачем вообще нужен пустой?

 public class OperationResult<T>
{
    public OperationResult()
    {
    }

    public OperationResult(T result, string message) : this()
    {
        this.Result = resu<
        this.Message = message;
    }

    public T Result { get; set; }
    public string Message { get; set; }
}
  

}

Комментарии:

1. C # сделает это за вас, только если вы не объявите никаких других конструкторов.

Ответ №1:

Если вы не объявите никаких конструкторов, C # примет конструктор по умолчанию без аргументов. Итак, если вам не нужны никакие перегрузки для конструктора, а также не нужно писать код при создании нового экземпляра класса, вам не нужно объявлять конструктор. Однако, если у вас есть перегрузки для конструктора (если вы объявляете конструктор с аргументами), конструктор без аргументов не будет доступен, если вы явно не объявите его. И в случае, если вам не нужен какой-либо код внутри него, это будет похоже на пустой конструктор, который вы упомянули в своем примере.

Ответ №2:

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

Пример.

 MyClass
{
    int sum;
    public MyClass()
    {
        sum = 0;
    }
}
  

Теперь, когда использовать параметризованный конструктор?

Допустим, вы хотите инициализировать объект с некоторой указанной конфигурацией, или, допустим, вы хотите использовать внедрение зависимостей с помощью constructor.

Ответ №3:

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

 var result = new OperationResult {Message = "Hello world"};
  

Это также полезно, когда у вас есть общедоступные set свойства.

Конструкторы цепочки полезны, когда у вас есть логика, которая будет повторяться в конструкторах, или когда у вас есть базовые инициализации.

Например, рассмотрим, что у нас есть следующее:

 public sealed class MyClass {
    public MyClass() {
         Tags = new List<string>();
    }

    public MyClass(string username) : this()
    {
        if(string.IsNullOrWhiteSpace(username))
            throw new ArgumentNullException(nameof(username));

        Username = username;
    }

    public string Username {get; set;}
   
    public List<string> Tags {get;set;}
}
  

Здесь у нас есть список, идентифицированный как Tags , и он инициализируется конструктором, у которого нет параметров.

Если мы вызовем MyClass(string username) без включения : this() , то базовый конструктор не будет запущен, и список, идентифицированный как Tags , будет инициализирован значением по умолчанию null .

Если бы мы попытались выполнить какое-либо действие с Tags , было бы выдано исключение, например, NullReferenceException .

Например, что, если бы мы хотели выполнить такое действие, как получение по индексу или вызов метода LINQ и т. Д.? Можно предположить любой тип, поскольку List<string> он не был инициализирован.

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

Например, давайте рассмотрим Newtonsoft Json. Если мы не предоставим конструктор без параметров и конструктор с [JsonConstructor] атрибутом, десериализация выдаст ошибку.

Я не уверен, так ли это в случае с Entity Framework, но обычно, если вам нужен конструктор без параметров исключительно для этой цели, вы его установите private .