#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
.