C# 设置可空属性的默认值的首选方法?
我进退两难。(简化的)任务是重新设计以下数据持有者类C# 设置可空属性的默认值的首选方法?,c#,properties,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
{
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实例。据我所知,不会有任何其他限制(但您知道客户的规格并不总是反映实际情况)。您只能确保在使用该属性时不会返回
null
:
class Stuff
{
private String _SomeInfo;
public String SomeInfo
{
get { return _SomeInfo ?? String.Empty; }
set { _SomeInfo = value; }
}
}
文本控件(例如在ASP.NET中)使用相同的方法,text
属性从不返回null
,而是返回String.Empty
例如():
您还可以在setter而不是getter中实现逻辑,这样您的back字段总是有一个有效值
class Stuff
{
private String _SomeInfo = string.Empty;
public String SomeInfo
{
get { return _SomeInfo; }
set
{
if (value != null)
{
_SomeInfo = value;
}
}
}
}
只需添加另一个答案,您还可以在单个语句中为string对象设置默认值
class Stuff
{
private String Something {get; set;} = string.Empty;
}
嗯-您的第一个选项不符合您的要求-因为我仍然可以将属性设置为null#2是您唯一真正的选择。如果初始化是指某种形式的反序列化,请注意某些实现不会执行构造函数代码。#2的另一个次要特点可能是在设置值时而不是在检索时验证输入。如果您发现经常检索
null/Empty
值,那么最好在设置为空时进行一次/很少检查。编辑:请注意,这假设您足够警惕,不会将支持字段设置为null。您可能希望更新if
检查以设置字符串。清空,而不是什么都不做。例如:myStuff.SomeInfo=“你好!”;myStuff.SomeInfo=null;Console.WriteLine(myStuff.SomeInfo)//你好代码>编辑:可能简单到\u someInfo=value??字符串。空
@ChrisSinclair我认为这真的取决于OP。如果出现错误,也可以决定抛出异常…+1我同意有几个选项。我之所以建议它,是因为赋值String.Empty
将与OP现在演示的行为一致。@vc74我认为它在开始时,在赋值之前是空的,不是吗。当然,我理解你的观点,我认为这是正确的。然而,我相信它仍然需要在二传手和接球手上都有一个保护者。既然getter本身就足够了,那么基于setter的保护器就变得多余了,不是吗?没有在代码中尝试过-我只是在这里计算。@KonradViltersten它不会为null,它被初始化为emptyI不为meIt编译,仅当模型中的参数不是必需的且未发送时才有效。当参数在正文中发送且值为空时,它不起作用。这非常有效-谢谢
class Stuff
{
private String Something {get; set;} = string.Empty;
}