2016-04-15 13 views
0

私はかなりヌル・オペレーターの使用に関して、それらの違いを理解していない記事からの次のコードを持っている:ヌルオペレータの混乱

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

この1は私には明らかである私は、 nullの場合はmemberAccessExprをチェックし、nullの場合は "Match"との比較がfalseを返します。正しいですか?

混乱は、第1が付属しています:

if (memberSymbol?.ToString().StartsWith("System.Text.RegularExpressions.Regex.Match") ?? true) return; 
このコード行は、私には思わ

は、ほとんど最初のと同じである私は、単純なヌルチェックを行い、その後、返す関数を呼び出すので、ブール値(!=StartsWith)...なぜ、最初の行ではなく、追加の?? - 演算子が必要ですか?たぶんそれは暗黙的な== true比較と何かがあり、それは?? - 演算子なしで行われるでしょうか?

私は、見当もつかないので、多分あなたたちは私を啓発することができます)

乾杯、 マイケル

答えて

2

それはだ場合は、左の部分はnull、または右の一部である場合は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; 
最後の行は、あなたを混乱させる場合は0

は、??オペレータは大体意味:

+0

大丈夫2行目の式は良い答えてくれてありがとうstuff..but NULL可能bool..confusingあるので、今、私は、それを得る:)を使用しているので、 –

+0

それがNULL可能ブール値となり'? '演算子であるので、' null'値と右辺式の結果( 'bool')の両方を保持できる必要があります。したがって' bool?'です。コードはコンパイラのコードではなく、私があなたに説明するために書いたものであることに注意してください。 – Jcl

+0

だから、基本的にオブジェクトの何かを呼び出すと?単純な型を返す演算子、私は結果を確認することができます??演算子は型のnullableになるので、右か? –

0

「左の部分がnullの場合は、右側の部分を返し、それ以外の戻り値は、一部を残し、」あなたは???

に関するいくつかの速記の演算子を持っています?. 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";