devneko94
@devneko94 (Devneko)

Are you sure you want to delete the question?

Leaving a resolved question undeleted may help others!

x == null, x is null, x.HasValue null判定するならどれ使う?

解決したいこと?

C# で書いたコードをレビューしてもらった際に
「この"x is null"のところ...null許容値でしょ? "HasValue"の方が見て分かりやすいからいいよ」
と指摘を受けて、ふと思った。

こんなとき、みんなはどういう考えでどんな処理にするのだろう?と...。

と、いうわけでアンケートチックに質問させてください。
できれば理由も添えていただけると参考になります。

選択肢

①昔から使える "x == null"

x == null
if (x == null)
{
    // 何かしらの処理
}

②C# 7.0以降からパターンマッチングが発展してるし "x is null" 使っとけば問題ない

x is null
if (x is null)
{
    // 何かしらの処理
}

③レビュアー視点から、見た目に分かりやすい "x.HasValue" ※ただし、null許容値に限る

x.HasValue
if (x.HasValue)
{
    // 何かしらの処理
}

④その他

個人的には 2 な理由で is null 使ってます。
ぜひご回答のほど、よろしくお願いいたします。

0

その中から選ぶのであれば、私はx is null
というかその反転のx is not nullの方が使う機会多いかな。

ちな、x == nullは演算子がオーバーロードされる可能性があるので、古い開発環境でない限り避けた方が良さげ。

Null許容参照型を有効にしちゃうので、もはやNullable#HasValueは使う機会はないかなぁ。あるのかぁな。

3Like

@ktz_alias さん
ご回答ありがとうございます。
会社の開発環境が古いからか、使える構文が限られちゃってるんですよね。
それでも、なるべく最新版とのギャップをなくそうと1人奮闘する毎日です。(1人でするな。)

0Like

その中ならx is nullですかね。null条件演算子、null合体演算子で済むパターンなら、そちらを使います。基本的には、なるべくnull判定せずに済む作りを心掛けています。

理由を追記しておくと、2が最もリーダブルである事と、
・1は演算子オーバーロードの問題がある。(@ktz_aliasさんの回答にもありますね)
・3はNullableの為だけに判定方法を使い分けるのが違和感。
といった感じです。

1Like

消極的な理由から、基本的には == null を使用し、Null許容型に限り .HasValue を使用しています。

== nullを使用する理由は以下の2点です。

  • 仕事上で複数のC#バージョンを扱う為、統一する為(演算子のオーバーロードは業務の性質上行われないことも理由)
  • nullかどうかより、defaultかどうかを判定することが多い為、両者の表記を統一する為(is defaultが書けるなら、isを使用する方向で統一したくある)

.HasValue を使用する理由は、この判定は「nullかどうかを判断」するのではなく、「値がセットされたか判断」する目的で書かれることが多い(と感じている)為です。

あくまで、一意見として流して貰えれば幸いです。

1Like

Your answer might help someone💌