我处于两难境地。 (简化)任务是重新设计以下数据持有者类
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 实例的创建可能是使用构造函数和初始化完成的,如果它有任何意义。据我所知,不会有任何其他限制(但你知道客户的规格并不总是反映现实)。
答案 0 :(得分:20)
您只能确保在使用该属性时永远不会返回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;
}
}
答案 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;
}