检查函数结果是否为空值

时间:2012-03-23 19:32:35

标签: c# .net null-coalescing-operator

在回答this question时,BlackBear建议更换

 string y = Session["key"] == null ? "none" : Session["key"].ToString();

 string y = (Session["key"] ?? "none").ToString();

如果Session["key"]是一个字符串值,这很有用,但是如果我想用一个对象做什么呢?例如,我可以这样做:

 string y = GetMyObject() == null ? "none" : GetMyObject().ToString();

但如果我不想两次评估GetMyObject()怎么办?我唯一的选择是将结果存储在变量中,然后检查该变量是否为null?

 var x = GetMyObject();
 string y = (x == null) ? "none" : x.ToString();

编辑:这都是理论上的 - 我以前遇到过它,但我现在面前没有一个具体的例子。话虽如此,这是一个示例类。

class MyObject
{
   private MyObject() { }
   public MyObject GetMyObject() { return new MyObject(); }
   public override string ToString() { return "A String"; }
}

如果我string y = (GetMyObject() ?? "none").ToString();,我会

  

运营商'??'不能应用于'MyObject'和'string'类型的操作数。“

理想情况下,我能够做到

 string y = GetMyObject().ToString() ?? "none";

并且即使GetMyObject()为null也能使用它。基本上空归合运算符充当自包含try {} catch (NullReferenceException) {}。我知道我不能,但这将是理想的。

3 个答案:

答案 0 :(得分:4)

BlackBear的解决方案完全正常:

string y = (GetMyObject() ?? "none").ToString();

设置为yGetMyObject().ToString()(如果GetMyObject()返回非空引用)或<{1}}。在弦乐上有一个微小的小打击叫"none".ToString(),但我非常怀疑它是否重要。

如果ToString()返回GetMyObject(),则没问题。如果它返回object 无法转换为的某种特定类型,只需将其中一个转换为string,例如

object

话虽如此,我可能会在那时使用扩展方法 - 或者只是简单地做。

答案 1 :(得分:2)

您似乎希望使用以某些语言编写为?.的null-safe解除引用运算符:

var x = GetMyObject()?.ToString() ?? "none";

不幸的是C#没有这个运算符。你可以按照你已经这样做的方式去做。

此运算符为considered,用于添加语言。但它没有进入任何已发布的C#版本。

答案 2 :(得分:0)

代码中缺少的内容[通常]可以添加:

private static object SafeToString( object obj, string defaultString = "none" )
{
    return obj != null ? obj.ToString() : defaultString;
}