Необнуляемая строка инициализируется как ноль - PullRequest
7 голосов
/ 19 октября 2011

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

//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? Есть ли стандартный способ заставить это поведение, кроме пользовательского геттера?

Ответы [ 4 ]

24 голосов
/ 19 октября 2011

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

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

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

11 голосов
/ 19 октября 2011

Строка является ссылочным типом, она всегда может иметь значение NULL.

3 голосов
/ 19 октября 2011

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

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

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

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

0 голосов
/ 23 июля 2013

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

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

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

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

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

...