2013-06-12 2 views
8

Я в дилемме. (Пониженная) задача состоит в том, чтобы перепроектировать следующие данные класса ГельдераПредпочтительный способ установки значений по умолчанию для нулевых свойств?

class Stuff 
{ 
    public String SomeInfo { get; set; } 
} 

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

Подход по конструктору.

class Stuff 
{ 
    public String SomeInfo { get; set; } 
    public Stuff() { SomeInfo = String.Empty; } 
} 

Подход по недвижимости.

class Stuff 
{ 
    private String _SomeInfo; 
    public String SomeInfo 
    { 
    get { return _SomeInfo ?? String.Empty; } 
    set { _SomeInfo = value; } 
    } 
} 

Обратите внимание, что создание Материал случаях может быть сделано с помощью конструктора, а также инициализации, если это какое-то значение. Насколько мне известно, не будет никаких других ограничений (но вы знаете, как спецификации клиентов не всегда отражают реальность).

+9

Ну, ваш первый вариант не соответствует вашим требованиям - так как я все же могу установить свойство null. # 2 - ваш единственный реальный выбор. –

+1

Если по инициализации вы подразумеваете, что какая-то форма десериализации должна знать, что некоторые реализации не выполнят код конструктора. – Rafal

+1

Другим незначительным ароматом на # 2 может быть проверка ввода при установке значения, а не при извлечении. Если вы обнаружите, что вы очень часто извлекаете значения «null/Empty», вместо этого выполняете проверку один раз/редко, когда настройка может быть предпочтительной. EDIT: Обратите внимание, что это предполагает, что вы достаточно бдительны, чтобы не установить для поля поддержки значение null. –

ответ

17

Вы можете только убедиться, что null никогда не возвращается, когда вы используете свойство:

class Stuff 
{ 
    private String _SomeInfo; 
    public String SomeInfo 
    { 
    get { return _SomeInfo ?? String.Empty; } 
    set { _SomeInfo = value; } 
    } 
} 

Такой же подход используется при текстовых элементов управления (например, в ASP.NET), где Text свойство никогда не возвращается null но String.Empty.

Например (ILSpy):

// System.Web.UI.WebControls.TextBox 
public virtual string Text 
{ 
    get 
    { 
     string text = (string)this.ViewState["Text"]; 
     if (text != null) 
     { 
      return text; 
     } 
     return string.Empty; 
    } 
    set 
    { 
     this.ViewState["Text"] = value; 
    } 
} 
5

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

class Stuff 
{ 
    private String _SomeInfo = string.Empty; 
    public String SomeInfo 
    { 
    get { return _SomeInfo; } 
    set 
    { 
     if (value != null) 
     { 
     _SomeInfo = value; 
     } 
    } 
    } 
} 
+0

Возможно, вы захотите обновить 'if' check, чтобы установить' String.Empty' вместо того, чтобы ничего не делать. Например: 'myStuff.SomeInfo =" Hello! "; myStuff.SomeInfo = null; ЕЫпе (myStuff.SomeInfo); // печатает Hello! 'EDIT: возможно, так же просто, как' _someInfo = value ?? String.Empty; ' –

+0

@ChrisSinclair Я думаю, что это действительно до OP. Можно также принять решение об исключении в случае ошибки ... –

+0

+1 Я согласен, что есть несколько вариантов. Я только предложил это, потому что присвоение 'String.Empty' было бы совместимо с тем, что демонстрирует сейчас OP. –

4

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

class Stuff 
{ 
    private String Something {get; set;} = string.Empty; 
} 
Смежные вопросы