我从一篇文章中得到以下代码,我完全不理解它们在使用null操作符方面的区别:
if (memberAccessExpr?.Name.ToString() != "Match") return;
这个我很清楚,我想,检查memberAccessExpr
是否为空,如果为空,与“匹配”的比较返回false,是否正确?
第二个问题出现了混乱:
if (memberSymbol?.ToString().StartsWith("System.Text.RegularExpressions.Regex.Match") ?? true) return;
这行代码在我看来与第一行完全相同,因为我做了一个简单的空检查,然后调用一个返回布尔值的函数(!=
与StartsWith
) ...那么为什么我需要一个额外的?? - 运算符,而不是在第一行?也许它与没有?? - 运算符的隐式== true
比较有关?
我不知道,所以也许你们可以开导我:)
干杯, 迈克尔
答案 0 :(得分:2)
如果左侧部分为null
,则空传播运算符返回null
,如果不是,则返回右侧部分。如果右边的部分会返回一个值类型,它会转换为Nullable<T>
...所以如果右边的部分会返回bool
,如果有?.
,它将会返回Nullable<bool>
(或bool?
)。
所以对于第一个:
if (memberAccessExpr?.Name.ToString() != "Match") return;
粗略表示(故意冗长):
string comparer;
if(memberAccessExpr == null)
comparer = null;
else
comparer = memberAccessExpr.Name.ToString();
if(comparer != "Match") return;
第二个:
if (memberSymbol?.ToString().StartsWith("System.Text.RegularExpressions.Regex.Match") ?? true) return;
粗略地表示:
bool? comparer;
if (memberSymbol == null)
comparer = null;
else
comparer = memberSymbol.ToString().StartsWith("System.Text.RegularExpressions.Regex.Match");
if(comparer ?? true) return;
如果最后一行让您感到困惑,??
运算符大致意味着:&#34;如果左侧部分为空,则返回右侧部分,否则返回左侧部分&#34;
答案 1 :(得分:0)
您有一些关于?
和??
?. Operator MSDN Documentation
int? length = customers?.Length; // null if customers is null
Customer first = customers?[0]; // null if customers is null
int? count = customers?[0]?.Orders?.Count(); // null if customers, the first customer, or Orders is null
?? Operator MSDN Documentation
// Assign i to return value of the method if the method's result
// is NOT null; otherwise, if the result is null, set i to the
// default value of int.
int i = GetNullableInt() ?? default(int);
?: Operator MSDN Documentation
// if-else construction.
if (input > 0)
classify = "positive";
else
classify = "negative";
// ?: conditional operator.
classify = (input > 0) ? "positive" : "negative";