完全非ナルテスト


更新:
TLドクターif(x is object) {/* x is not null */}C≧8の前に、Cで許容できない全ての参照タイプがある.
つまり、このリファレンスを使用する前にリファレンスがnullでないことを確認する信頼できる方法を持たなければなりませんでした.
長年にわたって、より新しいCの経典は、これをチェックするより良い方法を提供しました.
我々はナイーブから始めた
if(x != null) 
{
    // Do something with x here
}
これはナイーブだから!=== ) 演算子はCの剰余でオーバーロードできます.この演算子を定数(null ) そして、どんなタイプが予期しない結果をもたらすかもしれません!= 演算子は、通常期待される結果を生成しないように.
c≧6はヌル条件演算子を導入した.?. and ?[] - これは、インスタンスがNULLでない場合、型のインスタンスメンバー(メソッド、インデクサーまたはプロパティ)にアクセスできることを意味します.
インスタンスがnullの場合、メソッドは呼び出されませんし、プロパティやインデクサーがアクセスされません.しかし、式全体の結果はNULLになります(これは既に存在しているヌル合体演算子で処理できます.?? ).
c≠7はパターンマッチングを導入した.以下のようにNULLをチェックすることができます.
if(x is null)
{
   // do stuff if it's null
}
else 
{ 
    // do stuff if it's not 
} 
Cを含む多くの開発者は、自分自身を含む、はるかに便利なチェックが見つからなかった.
個人的には、単にこれを使いました.
if(!(x is null))
{
   // do stuff if x is not null
}
どちらがかなり醜いコードになりますが、少なくとも安全です.
それから、私はJared Parsonsによってこのつぶやきを見ました:

ジャリングパーソンズ
@ jaredpar

"x is null "は"x is object "との完全なペアリングです.一つは正規のNULLチェックです.
午後18時00分
どのように考えて私を得たかx is object C≧の完全非ヌルテスト?だから私はgooglingしようとしたc# is object そして、これらの行に沿ってすべての種類の、唯一の空白を来る.
失敗した場合、明らかなオプションは、is 演算子はもっと慎重に-確かに十分-

When using the type pattern to perform pattern matching, is tests whether an expression can be converted to a specified type and, if it can be, casts it to a variable of that type.

expr is type varname

where expr is an expression that evaluates to an instance of some type, type is the name of the type to which the result of expr is to be converted, and varname is the object to which the result of expr is converted if the is test is true.


これまでのところ、NULLテストの指示はありませんが、次の行に表示されます.

The is expression is true if expr isn't null, and any of the following is true:


(条件を一覧表示します).
Cのどれかの種類はobject , つまり、式x is object を返します.x がNULLの場合、これは完全な非NULLテストを行います.
もう一つの利点は、Xが値型であるとき、コンパイラがXをNULLとしないように、警告を出すでしょうCS0183 ) xを使用しようとするとき、xは値型の場合、オブジェクトです.

warning CS0183: The given expression is always of the provided (‘object’) type