如果为空则返回空字符串

47

我的代码中有这个:

SelectList(blah, "blah", "blah", cu.Customer.CustomerID.ToString())

当返回null时,会出现错误,我该如何使CustomerID成为空字符串呢?

/M


1
CustomerID 是空值,还是 Customer 本身为空?此外,CustomerID 的类型是什么? - Thorarin
4个回答

99

(C# 6.0更新)

如果你使用的是C# 6或更高版本(Visual Studio 2015或更高版本),那么你可以使用空值传播运算符?.来实现这一功能:

var customerId = cu.Customer?.CustomerId.ToString() ?? "";

空值条件运算符的一个有用特性是,如果您想测试多个嵌套属性是否为 null,它也可以 "链接":

// ensure (a != null) && (b != null) && (c != null) before invoking
// a.b.c.CustomerId, otherwise return "" (short circuited at first encountered null)
var customerId = a?.b?.c?.CustomerId.ToString() ?? "";

对于C# 6.0之前的版本(VS2013或更早版本),可以使用以下方式进行合并:

string customerId = cu.Customer != null ? cu.Customer.CustomerID.ToString() : "";

在尝试访问对象成员之前,只需检查该对象是否非空,否则返回空字符串。

除此之外,在某些情况下,空对象模式很有用。这意味着您确保您的 Customer 的父类(在本例中为 cu 的类型)始终返回一个实际的对象实例,即使它是“空”的。如果您认为它可能适用于您的问题,请查看此链接以获取示例:如何在C#中创建空对象


28

(C# 2.0 - C# 5.0)

条件运算符可以使用,但如果你想要更短的表达式来处理任意对象,可以使用:

(myObject ?? "").ToString()

这里是来自我的代码的真实例子:

 private HtmlTableCell CreateTableCell(object cellContents)
 {
     return new HtmlTableCell()
     {
         InnerText = (cellContents ?? "").ToString()             
     };
 }

2
这段代码的一个结果是冗余的 "".ToString(),此外 (myObject ?? "") 只有在 myObject 一开始就是字符串时才能工作,使 .ToString() 更加不必要。我认为你的意思是 myObject?.ToString() ?? "" - Robert Synoradzki
2
@ensisNoctis 1. 这是在我们使用 C# 5 的时候编写的,当时没有 ?. 运算符。对于 C# 6+,我会使用 ?.。2. .ToString() 在对象上可以正常工作。我坚持我的答案适用于 C# 2 - C# 5:已更新以澄清。 - Dima Korobskiy
没问题 :) - Robert Synoradzki

17

这取决于CustomerID的类型。

如果CustomerID是一个字符串,则可以使用空值合并运算符

SelectList(blah, "blah", "blah", cu.Customer.CustomerID ?? string.Empty)

如果 CustomerID 是一个 Nullable<T>,那么你可以使用:

SelectList(blah, "blah", "blah", cu.Customer.CustomerID.ToString())

这将起作用是因为Nullable<T>ToString()方法会在实例为 null(技术上是HasValue属性为false)时返回一个空字符串。


1
SelectList(blah, "blah", "blah", 
(cu.Customer.CustomerID!=null?cu.Customer.CustomerID.ToString():"")
)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接