概要
コードを書いている時に、毎回nullチェックを書くのが苦痛になってきたので、拡張メソッドを使って関数化させたほうが途中まで打ってインテリジェンスが使えるのと、デバッグコードを仕込む時にも大変便利なのではないかなと使いやすくしようというのが目的です。
実装
C#では全ての型(既に定義済みの型、ユーザー定義型、参照型、値型)がObjectを直接、又は間接的に継承しているのでObjectで拡張メソッドを書きます。
public static bool isNull(this System.Object obj)
{
return obj == null;
}
反対にnullじゃなければも拡張メソッドを使って関数化させます。
public static bool isNotNull(this System.Object obj)
{
return obj != null;
}
ただ、この方法をそのままチーム開発でやると、人によっては通常のnullチェックをしてるけど、
拡張メソッドでチェックしてる人がいるという事が起き得ると思うので、あらかじめNullチェックする際のコーディング規約を決めたほうがリファクタリングやソースレビューする際にスムーズに進むと思います。
参考
object (C# リファレンス)
https://docs.microsoft.com/ja-jp/dotnet/csharp/language-reference/keywords/object
追記 7/20
@soiさんから、int型などnullになりえない型でも拡張メソッドが使えてしまうので、
ジェネリックメソッドにしてnullになるものだけ使えるようにしたほうがいいという指摘を受けました。
public static bool isNull<T>(this T obj) where T : class
{
return obj == null;
}
public static bool isNull<T>(this T? obj) where T : struct
{
return obj == null;
}
whereを使ってclassやnull許容型のstructなどnullになるものだけを制約するようにします
参考
where (ジェネリック型制約) (C# リファレンス)
https://docs.microsoft.com/ja-jp/dotnet/csharp/language-reference/keywords/where-generic-type-constraint
Null 許容型 (C# プログラミング ガイド)
https://docs.microsoft.com/ja-jp/dotnet/csharp/programming-guide/nullable-types/