C#のnull判定の方法は?|効率よく判定できる方法をご紹介!

- システム
エンジニア - null判定について詳しく知りたいのですが、複雑そうで心配です。
- プロジェクト
マネージャー - まず基本のnull判定とは何かから詳しくみていきましょう。
C#のnull判定とは?
C#のnull判定方法を紹介する前に、まずnull判定について簡単に説明します。以下のC#のサンプルをご覧ください。なおソースの先頭に「using System;」を記述してください(Visual Studioで作成したcsファイルには最初から記述されています。)
class StringClass
{
private string str;
public StringClass(string s)
{
str = s; // コンストラクタでクラスフィールドstrを初期化
}
public void DispLength()
{
Console.WriteLine(str.Length); // 文字列の長さを返す
}
}
static void Main(string[] args)
{
StringClass sc = new StringClass(null); // ミスによりnullを渡してしまっている
sc.DispLength();
}
nullにより例外が発生してしまう
上の例ではStringClassをnewで生成し、文字列の長さを表示しようとしています。ところが、newにする時に文字列ではなく、nullを渡してしまっています。なおnullとは、クラス型変数が空であるという意味を示す値です。
上のサンプルを実行すると、以下のような例外(exception)が発生してプログラムが異常終了してしまいます。
Unhandled exception. System.NullReferenceException: Object reference not set to an instance of an object.
上記のサンプル中にある、「Console.WriteLine(str.Length); // 文字列の長さを返す」の箇所は、strがnullのためLengthメソッドを実行できず、例外が発生しているのです。
null判定で例外の発生を回避できる
nullによる例外発生は、どう対処すれば良いのでしょうか。それにはnull判定をすればよいのです。StringClassのコンストラクタを以下のように変えましょう。
public StringClass(string s)
{
if (s==null) s = “Error”; // nullが渡されたらError文字列を入れる
str = s;
}
こうすることで、nullを渡しても例外は発生しなくなります。また、プログラムの規模が大きくなると、newにしたクラスが処理の過程でnullになっている可能性もあります。以下のようにDispLengthをコールするところでも、その前にnull判定を入れた方が良いですね。
StringClass sc = new StringClass(null);
・・・様々な処理を行う
if (sc!=null)
sc.DispLength();
else
// scがnullだった場合のエラー処理を行う
文字列のnull判定機能
C#には、標準で文字列のnull判定をする機能があります。サンプル内にある、StringClassのコンストラクタを以下のように修正すると、空文字のダブルクォーテーション、もしくはnullであるかどうかの判定ができます。
public StringClass(string s)
{
if (!System.String.IsNullOrEmpty(s)) // nullでも空文字””でもなければstrに代入する
str = s;
else
str = “Error”;
}
他にString.IsNullOrWhiteSpaceというメソッドもあります。これはnullとダブルクォーテーションだけでなく、半角や全角のダブルクォーテーションにも対応できます。IsNullOrEmptyよりもこちらの方が役立ちます。
null条件演算子によるnull判定
C#にはnull条件演算子という機能があります。これを使用しても例外の発生を回避できます。StringClassのDispLengthメソッドを以下のように直すだけで、例外の発生はなくなります。
public void DispLength()
{
Console.WriteLine(str?.Length);
}
strと.Lengthの間に?を入れるだけで、strがnullだった場合はアクセスを行いません。一方で、strがnullだった場合、何も表示されずに終わります。
nullだった場合の処理が必要なら三項条件演算子
上の例でstrがnullだった場合、何も表示するのではなく、0を表示したい場合はどうすれば良いのでしょうか。if文でも可能ですが、三項演算子を使うとスマートに記述できます。
public void DispLength()
{
Console.WriteLine(str != null ? str.Length : 0);
}
これでstrがnullの場合は0が表示されます。三項演算子は「条件式 ? 式が成立する時の処理 : 式が成立しない時の処理」、と言う文法で条件による処理の振り分けが出来ます。
これはC#だけでなく、C言語などの古い言語にも昔からある機能なので、積極的に活用しましょう。
null判定に特化したnull合体演算子
C#にはnull判定に特化した演算子があります。それがnull合体演算子の??です。DispLengthを以下のように変えましょう。
public void DispLength()
{
str = str ?? “”;
Console.WriteLine(str.Length);
}
「str ?? “”」と記述することで、strがnullだった場合は””を返し、そうでなければstrを返す、という処理が行われます。null判定を行うのであれば、このnull合体演算子を使用することで、意図が明確になってよいでしょう。
なおこれを実行すると、””の文字列の長さの0が表示されます。
C# 8.0のnull合体演算子
C# 8.0から新たに、??=というnull合体演算子が追加されました。これを使うとDispLengthを以下のように記述できます。
public void DispLength()
{
str ??= “”;
Console.WriteLine(str.Length);
}
「str ??= “”;」は、もしstrがnullだったら””を入れるという処理になります。??よりさらに簡潔に記述することができます。
[]?でコレクションも安全に使用できる
C#のnull条件演算子には、コレクションで使用できる[]?があります。以下のように使用します。なおこれを実行する場合、ソースの先頭に「using System.Collections.Generic;」を記述してください。
static void Main(string[] args)
{
var list = new List<string>();
list.Add(“ABC”);
Console.WriteLine(list[0]?.ToLower());
list[0] = null;
Console.WriteLine(list[0]?.ToLower());
}
ToLower()は、大文字を小文字に変えるメソッドです。これを実行するとabcと表示されて終了します。2つ目のConsole.WriteLineで例外が発生しないのは、[0]?によりnull判定が行われていて、中身がnullだった場合、何も処理されないからです。
null許容型で基本型でもnullを持てる
C#にはnull許容型という機能があり、これを使うと本来はnullを代入できない基本型でもnullを使えるようになります。以下のサンプルを見てください。
static void Main(string[] args)
{
int? a = null;
float? b = null;
Console.WriteLine(a);
Console.WriteLine(b);
a = a ?? 123;
b ??= 1.23f;
Console.WriteLine(a);
Console.WriteLine(b);
}
null許容型で0とnullを区別できる
上のサンプルでは宣言時に「int?、float?」としていますが、基本型に「?」を付けることでnull許容型になります。実行すると、空行が2つ表示された後に、123と1.23が表示されます。nullが代入されていたので、??演算子で値が置き換わったのです。
null許容型の使い道としては、0とnullを区別したいときです。int型などで0にも意味を持たせたい場合は、nullを使うことができます。
初心者の場合はイメージできないかもしれませんが、null許容型でint等でも、nullを入れることができるということを覚えておきましょう。
- システム
エンジニア - 少し複雑ですが、いろんな方法があるということがわかり少し身近に感じることができました。
- プロジェクト
マネージャー - null判定を利用することで様々なメリットが生まれます。ぜひマスターしていきましょう。
C#のnull判定を使ってみよう
C#のnull判定方法について色々と紹介しましたが、いかがでしたでしょうか。様々な方法がありますが、少しずつ覚えていきましょう。重要なことはif文でも良いので、null判定を忘れないことですね。
FEnet.NETナビ・.NETコラムは株式会社オープンアップシステムが運営しています。
株式会社オープンアップシステムはこんな会社です
秋葉原オフィスには株式会社オープンアップシステムをはじめグループのIT企業が集結!
数多くのエンジニアが集まります。

-
スマホアプリから業務系システムまで
スマホアプリから業務系システムまで開発案件多数。システムエンジニア・プログラマーとしての多彩なキャリアパスがあります。
-
充実した研修制度
毎年、IT技術のトレンドや社員の要望に合わせて、カリキュラムを刷新し展開しています。社内講師の丁寧なサポートを受けながら、自分のペースで学ぶことができます。
-
資格取得を応援
スキルアップしたい社員を応援するために資格取得一時金制度を設けています。受験料(実費)と合わせて資格レベルに合わせた最大10万円の一時金も支給しています。
-
東証プライム上場企業グループ
オープンアップシステムは東証プライム上場「株式会社オープンアップグループ」のグループ企業です。
安定した経営基盤とグループ間のスムーズな連携でコロナ禍でも安定した雇用を実現させています。
株式会社オープンアップシステムに興味を持った方へ
株式会社オープンアップシステムでは、開発系エンジニア・プログラマを募集しています。
年収をアップしたい!スキルアップしたい!大手の上流案件にチャレンジしたい!
まずは話だけでも聞いてみたい場合もOK。お気軽にご登録ください。


C#新着案件New Job
-
システム開発/東京都新宿区/【WEB面談可/C#経験者/20代前半の方活躍中/経験1年以上の方活躍中】/在宅勤務
月給29万~34万円東京都新宿区(新宿駅) -
システム開発/東京都新宿区/【WEB面談可/C#経験者/20代後半~40代の方活躍中/経験年数不問】/在宅勤務
月給41万~50万円東京都新宿区(新宿駅) -
デバック、テスト項目の作成/神奈川県横浜市/【WEB面談可/C#経験者/20代前半の方活躍中/経験1年以上の方活躍中】/在宅勤務
月給29万~34万円神奈川県横浜市(桜木町駅) -
デバック、テスト項目の作成/神奈川県横浜市/【WEB面談可/C#経験者/20代後半~40代の方活躍中/経験年数不問】/在宅勤務
月給41万~50万円神奈川県横浜市(桜木町駅) -
基幹システム開発導入/東京都新宿区/【WEB面談可/C#経験者/20代前半の方活躍中/経験1年以上の方活躍中】/在宅勤務
月給29万~34万円東京都新宿区(西新宿駅) -
基幹システム開発導入/東京都新宿区/【WEB面談可/C#経験者/20代後半~40代の方活躍中/経験年数不問】/在宅勤務
月給41万~50万円東京都新宿区(西新宿駅)