设置可空属性的默认值的首选方法是什么?

时间:2013-06-12 11:43:00

标签: c# properties

我处于两难境地。 (简化)任务是重新设计以下数据持有者类

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

以满足不得返回 null 的要求。我可以想到两种方法来实现这一目标,经过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; }
  }
}

请注意, Stuff 实例的创建可能是使用构造函数和初始化完成的,如果它有任何意义。据我所知,不会有任何其他限制(但你知道客户的规格并不总是反映现实)。

3 个答案:

答案 0 :(得分:20)

您只能确保在使用该属性时永远不会返回null

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

文本控件(例如,在ASP.NET中)使用相同的方法,其中Text属性永远不会返回nullString.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;
    }
}

答案 1 :(得分:5)

你也可以在setter中而不是在getter中实现逻辑,这样你的后场总是有一个有效值

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

答案 2 :(得分:4)

只是为此添加另一个答案,您还可以在单​​个语句中为字符串对象设置默认值;

class Stuff
{
  private String Something {get; set;} = string.Empty;
}