.net column

.NET開発者のためのブログメディア

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

2020年09月04日
SE
null判定について詳しく知りたいのですが、複雑そうで心配です。
PM
まず基本の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を入れることができるということを覚えておきましょう。

 

SE
少し複雑ですが、いろんな方法があるということがわかり少し身近に感じることができました。
PM
null判定を利用することで様々なメリットが生まれます。ぜひマスターしていきましょう。

C#のnull判定を使ってみよう

C#のnull判定方法について色々と紹介しましたが、いかがでしたでしょうか。様々な方法がありますが、少しずつ覚えていきましょう。重要なことはif文でも良いので、null判定を忘れないことですね。


.NET分野でのキャリアアップをお考えの方は、現在募集中の求人情報をご覧ください。

求人一覧

また、直接のエントリーも受け付けております。

エントリー(応募フォーム)