1

我有一个具有string属性的对象,例如,一个具有重量和高度的患者对象。

但是当属性为空时,当我尝试使用它时,我的代码会失败,因为属性设置为空。我正在尝试创建一个函数来检查字符串/属性是否为空,如果是,请将属性设置为"".

我知道我可以这样做:

if(string.isNullOrEmpty(patient.weight)) patient.weight = "";

但是我需要代码尽可能的干净,而且我有很多属性,所以我不想手动检查每一个。理想情况下,我希望有一个可以获取字符串的函数(即使它为空也不会失败),并且如果它不为空则简单地返回值,或者""如果它为空则返回一个值。

谁能给我一个线索?

4

10 回答 10

5

就我个人而言,我会确保这些属性永远不会为空,方法是这样编写它们:

private string _Name = string.Empty;
public string Name
{
    get
    {
        return _Name;
    }
    set
    {
        _Name = value ?? string.Empty;
    }
}

但是,您正在寻找的可能是上面使用的??运算符,也称为null-coalescing 运算符,基本上是这个表达式:

x = y ?? z;

意思和这个一样:

if (y != null)
    x = y;
else
    x = z;

这也不完全正确。在上面的例子y中被评估了两次,这不会发生在??操作符上,所以一个更好的近似值是这样的:

var temp = y;
if (temp != null)
    x = temp;
else
    x = z;
于 2011-10-19T20:12:33.183 回答
2

好吧,空合并运算符听起来像是您的朋友:

string text = patient.Name ?? "";

可以编写一个扩展方法来做同样的事情,但我认为操作符最终可能更具可读性。

请注意,这不会设置属性 - 但这不是你所说的你想要的,在句子中:

理想情况下,我希望有一个可以获取字符串的函数(即使它为空也不会失败),并简单地返回值(如果它不为空),或者如果它为空则返回“”。

这正是上面的代码所做的。

于 2011-10-19T20:10:43.447 回答
2

像这样的东西?

public string EmptyIfNull(string value) 
{
    return value ?? String.Empty;
}
于 2011-10-19T20:10:58.520 回答
2

使用空合并运算符:

string s = Patient.Name ?? string.Empty;

所以如果Patient.Name为空,那么s将被设置为空字符串。

于 2011-10-19T20:11:03.200 回答
2

你可以做myString ?? string.Empty,它给你字符串,或者 string.Empty 如果它是空的。

于 2011-10-19T20:11:15.853 回答
1

当任何对象为空时,您可以使用??运算符返回您选择的默认值。

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"
于 2011-10-19T20:12:55.427 回答
1

我不确定您要问的是最适合您的解决方案。如果每次您不想检查 aString并返回""是否是null,我建议您将String字段初始化为"".

private String height = "";

代替

private String height;

顺便说一句,您应该存储诸如heightand weightasDouble和 not之类的值String,除非您有充分的理由不这样做。

于 2011-10-19T20:14:14.380 回答
0

向空合并运算符问好。

于 2011-10-19T20:11:51.500 回答
0

如果WeightHeight是整数,则它们不能为空。如果您的对象为并且您试图获取空对象的重量高度,那么您的代码就是错误的。如果一个字符串为空,那么它将打印一个空字符。

以下是非常优雅的:

if ( String.isNullOrEmpty(patient.weight) )
{
//DO STUFF HERE
}
else
{
//DO OTHER STUFF HERE
}

请理解如果患者为空,您甚至不应该出现在此代码块中。

如果您使用的是isNullOrEmpty,那么执行以下操作毫无意义。

patient.weight = "";

作者注

我想我不明白字符串为空会导致问题的原因。关于在初始化时将值设置为空字符串的要点当然是有效的。

于 2011-10-19T20:14:01.593 回答
0

您可以将@Jon 的想法更进一步,这样您就不必担心使用 ?? 到处:

像这样定义您的访问方法:

private String m_name = null;
public String Name
{
    get { return m_name ?? String.Empty; }
    set { m_name = value; }
}

无论您在何处访问 Name 属性,它都会为您执行空合并运算符。

于 2011-10-19T20:22:54.413 回答