2

similar questionを見た後、私は ヌル・伝播交換

if (attribute != null && attribute.Description == input) 

は...以下のヌル伝播に、(ほぼ)同じ振る舞うだろう...次の式ならば思っていましたバリアント?

if (attribute?.Description == input) 

これまでのところ、私は(何とかマイナー)の違い以下のみ決定することができる:場合input

  • ない可能性が場合inputに非NULL可能タイプ
  • のある行動、自身nullだろう

私には何かが欠けていますか?または他の違いがあるの


EDIT:最後に、私は最初のスニペットのために見つけた唯一のフェイルセーフ選択肢は、次のようになります。

if (attribute?.Description?.Equals(input) ?? false) 
+1

'attribute'は2番目のケースで1回だけ評価されるので、決して' NullReferenceException'を得ることはできません。最初のケースでは、 'attribute'が最初の条件の評価後で2番目の評価の前にnull以外の値に変更された場合、まだ例外が表示されます... –

+0

'input'を' null'にするには、まずそれをチェックしてください。それでは、nullableをnull値ではない値と比較できるので、違いはありません。 –

+0

@TimSchmelterそれは実際にあなたを助けることはありません。ポイントは、2つのスニペット*は、 'input'がnullのときに異なって振る舞います。そして、2つ目のスニペットでは、最初にそれをチェックすることはできません。 'input'が' null'になることが許されていれば、正しい結果を返すために、2番目のスニペットを最初のものに似たものにリファクタリングする必要があります。 – Servy

答えて

3

コードます仕事inputがであればnullを許可しない型。すべてのnullableでない型をnull可能な対応するものに暗黙的に変換するので、inputは、プロパティ値と比較するためにnullableに単純に持ち上げられます。あなたが述べたように

行動の唯一の違いは、inputnullであれば、2番目のスニペットはnullであるattribute区別するのない方法、それはfalseをする必要がありますを持っていない、ということである、とDescriptionnull、ここでどこにすべきtrueです。

ああ、これはattributeがローカル変数またはフィールドであると仮定しています。それがプロパティー(または実際にはより複雑な式)の場合、最初のスニペットで発生するように2回計算されたときに副作用または異なる値が返される可能性があります。

これはもちろん、単一のスレッドコンテキストを想定しています。マルチスレッドのコンテキストでは、attributeが別のスレッドからアクセス可能であれば(アクセス可能なフィールドまたは別のスレッドに公開されているラムダで閉じられているため)、その値は計算されるたびに異なる可能性があります。したがって、2つのスニペット前の段落で説明したのと同じ理由で異なります。

+0

決して 'ヌル 'でないかどうか知っていますか?契約を扱う? – Mafii

+0

私の場合、入力はあらかじめ定義された設定ファイルから来ます。 –