Ненулевая строка инициализируется как Null

#c# #string #initialization

#c# #строка #инициализация

Вопрос:

Я пытаюсь понять, почему ненулевая строка инициализируется как null вместо пустой строки. Например:

 //Property of class foo
public string Address_Notes { get; set; }

//Create instance of foo
foo myFoo = new foo();

//Get value of Address_Notes
var notesValue = myFoo.Address_Notes; //Returns null
  

Я сумасшедший, думая, что значение ненулевой строки по умолчанию должно быть String.Empty ? Существует ли стандартный способ принудительного выполнения этого поведения, отличный от пользовательского средства получения?

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

1. Что такое «ненулевая» строка?

2. @CodingGorilla, вы знаете, после того, как я опубликовал это, я подумал про себя: «Что такое ненулевая строка?». Честно говоря, я не уверен, о чем я думал. Я обвиняю это в написании ColdFusion прямо перед реальным языком…

3. на самом деле, если вы использовали спецификацию #, вам разрешено писать подписи типа ‘void Test(строка! s)’ который говорит, что ‘s не должно быть null’. ну, это проверка на нуль, а не ненулевая, но все же, если это попадет в C #, я бы ожидал продолжения вашего вопроса 🙂

Ответ №1:

Не существует такой вещи, как «ненулевая строка».

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

Вы могли бы обойти проблему, установив значение String.Empty в конструкторе для вашего класса (foo).

Ответ №2:

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

Ответ №3:

Строка является ссылочным типом — значения по умолчанию инициализируются null .

Вы можете инициализировать строки в конструкторе на string.Empty , и это лучшая практика для этого, потому что:

  • null значение означает «я не знаю, что это за значение»
  • string.Empty означает «значение пустое» или «значение не существует».

Таким образом, почти все свойства строки должны быть (вами) инициализированы в string.Empty значение. Попробуйте прочитать что-нибудь о «шаблоне нулевого объекта». Программирование в соответствии с этим принципом делает код намного более читаемым и защищенным от ошибок.

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

1. Я знаю, что этот ответ действительно старый, но есть много случаев, когда нулевая инициализация полностью подходит, особенно те, где вы не знаете, каково значение. Например, если у вас есть объект передачи данных со свойством string, конструктору имеет смысл инициализировать его значением null, поскольку человек, создающий это определение класса, на самом деле не хочет говорить «Я знаю, что это значение пустое, пока вы не скажете мне иначе». По этой причине я делаю все свойства в моих DTO обнуляемыми, например, Int32? . Почему? Я не знаю заранее, что ноль допустим!

Ответ №4:

Поскольку вы используете свойства для получения строковых значений, другим вариантом является возврат string .Пусто, если это на самом деле null.

 //Property of class foo
private string _address_Notes;
public string Address_Notes 
{ 
    get { return _address_Notes ?? string.Empty; } 
    set { _address_Notes = value; }
}
  

Гораздо лучшим решением было бы инициализировать строку в string.Пусто (если это ваше ожидаемое поведение). Вы можете сделать это в C # 6 следующим образом:

 public string Address_Notes { get; set; } = string.Empty;
  

Таким образом, это одноразовая инициализация, а не проверка каждого запроса.