空操作员混淆

时间:2016-04-15 09:01:42

标签: c#

我从一篇文章中得到以下代码,我完全不理解它们在使用null操作符方面的区别:

if (memberAccessExpr?.Name.ToString() != "Match") return;

这个我很清楚,我想,检查memberAccessExpr是否为空,如果为空,与“匹配”的比较返回false,是否正确?

第二个问题出现了混乱:

if (memberSymbol?.ToString().StartsWith("System.Text.RegularExpressions.Regex.Match") ?? true) return;

这行代码在我看来与第一行完全相同,因为我做了一个简单的空检查,然后调用一个返回布尔值的函数(!=StartsWith) ...那么为什么我需要一个额外的?? - 运算符,而不是在第一行?也许它与没有?? - 运算符的隐式== true比较有关?

我不知道,所以也许你们可以开导我:)

干杯, 迈克尔

2 个答案:

答案 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";