在回答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) {}
。我知道我不能,但这将是理想的。
答案 0 :(得分:4)
BlackBear的解决方案完全正常:
string y = (GetMyObject() ?? "none").ToString();
将设置为y
至GetMyObject().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;
}