Почему создание экземпляра объекта автоматически не создает его свойства? - PullRequest
0 голосов
/ 31 августа 2018

У меня есть следующие классы:

public class CustomerResult
{
    public string CompanyStatus { get; set; }
    public OverallResult Result { get; set; }
}

public class OverallResult
{
    public string StatusDescription { get; set; }
    public int StatusCode { get; set; }
    public string CustomerId { get; set; }        
}

Я создаю экземпляр:

var apiResult = new CustomerResult();

Почему следующее возвращает нулевую ссылку? Конечно, OverallResult создается, когда я создаю CustomerResult()?

apiResult.Result.CustomerId = "12345";

Ответы [ 2 ]

0 голосов
/ 31 августа 2018

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

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

public class CustomerResult
{
   public string CompanyStatus { get; set; }
   public OverallResult Result { get; set; }
}

public class OverallResult
{
   public OverallResult()
   {
       StatusCode = 55;
       StatusDescription = "Nothing to see";
   }
   public OverallResult(int statusCode, string status)
   {
      StatusCode = statusCode;
      StatusDescription = status;
   }
   public string StatusDescription { get; set; }
   public int StatusCode { get; set; }
   public string CustomerId { get; set; }        
}

void main()
{
   var result = new CustomerResult()
   {
       Result = new OverallResult(51, "Blah"),
   };
}
0 голосов
/ 31 августа 2018

Поскольку вы не создали экземпляр для Result. У ссылочных типов по умолчанию нулевые значения, а OverallResult - это класс, следовательно, ссылочный тип.

Вы можете сделать это в конструкторе.

public class CustomerResult
{
    public string CompanyStatus { get; set; }
    public OverallResult Result { get; set; }
    public CustomerResult(){
        Result = new OverallResult();
    }
}

если ваша C# версия выше, чем 6.0, есть более простой способ Инициализаторы авто-свойств

C # 6 позволяет назначить начальное значение для хранилища, используемого авто-свойством, в объявлении авто-свойства:

public class CustomerResult
{
    public string CompanyStatus { get; set; }
    public OverallResult Result { get; set; } = new OverallResult();
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...