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

Kon*_*ten 9 c# properties

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

class Stuff
{
  public String SomeInfo { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

以满足不得返回null的要求.我可以想到两种方法来实现这一目标,经过深度考虑15分钟后,我根本无法确定哪一个是首选.

由构造函数的方法.

class Stuff
{
  public String SomeInfo { get; set; }
  public Stuff() { SomeInfo = String.Empty; }
}
Run Code Online (Sandbox Code Playgroud)

财产方法.

class Stuff
{
  private String _SomeInfo;
  public String SomeInfo 
  { 
    get { return _SomeInfo ?? String.Empty; }
    set { _SomeInfo = value; }
  }
}
Run Code Online (Sandbox Code Playgroud)

请注意,如果具有任何重要性,可以使用构造函数和初始化来创建Stuff实例.据我所知,不会有任何其他限制(但您知道客户的规格并不总是反映现实).

Tim*_*ter 20

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

class Stuff
{
  private String _SomeInfo;
  public String SomeInfo 
  { 
    get { return _SomeInfo ?? String.Empty; }
    set { _SomeInfo = value; }
  }
}
Run Code Online (Sandbox Code Playgroud)

同样的方法也使用文本控件(在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;
    }
}
Run Code Online (Sandbox Code Playgroud)


小智 8

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

class Stuff
{
  private String Something {get; set;} = string.Empty;
}
Run Code Online (Sandbox Code Playgroud)

  • 仅当不需要且未发送模型中的参数时,它才有效。当参数在正文中发送并且值为空时,它不起作用。 (3认同)

vc *_* 74 5

您也可以在setter中而不是在getter中实现逻辑,这样您的back字段始终具有有效值

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