我有一个带属性(字符串)的对象。 例如:患者体重,身高。
但是当属性为null时,我尝试使用它时代码失败,因为该属性设置为null。所以我要做的是创建函数来检查字符串/属性是否为null,如果是,则将该属性设置为“”。
我知道我可以做其中一件事: if(string.isNullOrEmpty(patient.weight))patient.weight =“”;
但我需要代码尽可能干净,而且我有很多属性,所以我不想手动检查每一个。理想情况下,我希望有一个可以接受字符串的函数(即使它为null也不会失败),只返回值(如果它不是null),或者返回“”,如果它是null。
任何人都可以给我一个线索:(?
答案 0 :(得分:5)
就个人而言,我会确保这些属性永远不会为null,方法是这样写:
private string _Name = string.Empty;
public string Name
{
get
{
return _Name;
}
set
{
_Name = value ?? string.Empty;
}
}
但是,您正在寻找的可能是??
运算符,也称为null-coalescing operator,如上所用,基本上就是这个表达式:
x = y ?? z;
与此相同:
if (y != null)
x = y;
else
x = z;
这也不完全正确。在上面的示例中,y
被评估两次,??
运算符不会发生这种情况,因此更好的近似值是这样的:
var temp = y;
if (temp != null)
x = temp;
else
x = z;
答案 1 :(得分:2)
好null coalescing operator听起来像是你的朋友:
string text = patient.Name ?? "";
你可以编写一个扩展方法来做同样的事情,但我认为运营商可能最终会更具可读性。
请注意,这不会设置属性 - 但这不是你想要的,无论如何,在句子中:
理想情况下,我想要一个可以接受字符串的函数,(即使它为null也不会失败),只返回值(如果它不是null),如果它为null则返回“”
这正是上面的代码所做的。
答案 2 :(得分:2)
这样的东西?
public string EmptyIfNull(string value)
{
return value ?? String.Empty;
}
答案 3 :(得分:2)
使用null-coalescing运算符:
string s = Patient.Name ?? string.Empty;
因此,如果Patient.Name
为空,则s
将设置为空字符串。
答案 4 :(得分:2)
你可以做myString ?? string.Empty
,它给你字符串,或者string.Empty,如果它是null。
答案 5 :(得分:1)
当任何对象为空时,您可以使用??
operator返回您选择的默认值。
string a = null;
a = a ?? "womble";
// a now has the value "womble"
string b = "fluff";
b = b ?? "cabbage";
// b wasn't null, so it still has the value "fluff"
答案 6 :(得分:1)
我不确定您所问的是最适合您的解决方案。如果您每次都要查看String
并返回""
,如果是null
,我建议您将String
字段初始化为{{1} }}
""
而不是
private String height = "";
顺便说一句,您应该将private String height;
和height
等值设置为weight
而不是Double
,除非您有充分理由不这样做。
答案 7 :(得分:0)
跟null coalescing operator打个招呼。
答案 8 :(得分:0)
如果重量且高度是整数,则它们不能为空。如果您的对象 null ,并且您尝试获取空对象的权重的高度,则您的代码完全错误。如果字符串为null,则它将打印一个空字符。
以下是非常优雅的:
if ( String.isNullOrEmpty(patient.weight) )
{
//DO STUFF HERE
}
else
{
//DO OTHER STUFF HERE
}
请理解患者是否为空,您甚至不应该在此代码块中。
如果您使用 isNullOrEmpty ,那么执行以下操作毫无意义。
patient.weight = "";
作者注意
我想我不明白字符串为null会导致问题的原因。初始化时将值设置为空字符串的要点当然是有效的。
答案 9 :(得分:0)
你可以从@Jon更进一步的想法,所以你不必担心使用?到处:
定义您的访问方法:
private String m_name = null;
public String Name
{
get { return m_name ?? String.Empty; }
set { m_name = value; }
}
在您访问Name属性的任何地方,它都会为您执行空合并运算符。