C#でnull・空文字を判定する方法|IsNullOrEmptyの使い方と違いをわかりやすく解説

はじめに

C#で文字列を扱うとき、よく出てくるのが「null」と「空文字」の判定です。

たとえば、入力フォームが未入力かどうかを確認したり、APIから取得した値が存在するかをチェックしたり、データベースの文字列項目が空かどうかを判定したりする場面で使います。

C#では、nullと空文字は似ているようで別物です。

C#
string? name1 = null;
string name2 = "";
string name3 = "Hello";

name1は値そのものが存在しない状態です。一方で、name2は文字列オブジェクトは存在しているものの、中身が0文字の状態です。

この記事では、C#でnullや空文字を判定する基本から、string.IsNullOrEmptystring.IsNullOrWhiteSpaceの違い、実務でよく使う書き方までわかりやすく解説します。

1. C#でnull・空文字を判定する基本

1-1. nullとは何か

C#におけるnullとは、変数がどのオブジェクトも参照していない状態を表します。

C#
string? text = null;

この場合、textには文字列データが入っていません。空の文字列が入っているのではなく、そもそも参照先が存在しない状態です。

そのため、nullの変数に対してLengthTrim()などのメソッドやプロパティを呼び出すと、NullReferenceExceptionが発生します。

C#
string? text = null;

Console.WriteLine(text.Length); // エラー

C#で文字列を扱うときは、値がnullの可能性があるかどうかを意識することが重要です。

1-2. 空文字("")とは何か

空文字とは、文字数が0の文字列です。

C#
string text = "";

または、次のようにstring.Emptyを使って表すこともできます。

C#
string text = string.Empty;

空文字はnullとは異なり、文字列オブジェクト自体は存在しています。そのため、Lengthを呼び出してもエラーにはなりません。

C#
string text = "";

Console.WriteLine(text.Length); // 0

空文字は「値はあるが、中身が空」という状態です。

1-3. nullと空文字の違い

nullと空文字の違いを整理すると、次のようになります。

C#
string? value1 = null; // 値が存在しない
string value2 = ""; // 0文字の文字列

nullは参照先がない状態です。一方、空文字は文字列としては存在しており、文字数が0の状態です。

たとえば、次のような違いがあります。

C#
string? value1 = null;
string value2 = "";

Console.WriteLine(value1 == null); // true
Console.WriteLine(value2 == null); // false

Console.WriteLine(value2 == ""); // true

さらに、Lengthを呼び出した場合にも違いがあります。

C#
string? value1 = null;
string value2 = "";

Console.WriteLine(value1.Length); // エラー
Console.WriteLine(value2.Length); // 0

このように、nullと空文字は見た目上どちらも「値がない」ように見えることがありますが、C#では明確に別の状態として扱われます。

1-4. 判定が必要になる代表的な場面

C#でnullや空文字の判定が必要になる場面は多くあります。

代表的なのは、ユーザー入力のチェックです。

C#
string? userName = inputName;

if (string.IsNullOrEmpty(userName))
{
Console.WriteLine("名前を入力してください。");
}

フォームやコンソールから入力された値が未入力の場合、処理を進める前にチェックする必要があります。

APIレスポンスを扱う場合にも、nullや空文字の判定は重要です。

C#
string? token = response.Token;

if (string.IsNullOrEmpty(token))
{
Console.WriteLine("トークンが取得できませんでした。");
}

また、データベースから取得した値がnullになっているケースもあります。

C#
string? email = user.Email;

if (string.IsNullOrEmpty(email))
{
Console.WriteLine("メールアドレスが登録されていません。");
}

このように、C#で安全に文字列を扱うには、nullと空文字の違いを理解したうえで適切に判定することが大切です。

2. C#でnullを判定する方法

2-1. == nullで判定する

C#でnullを判定するもっとも基本的な方法は、== nullを使う書き方です。

C#
string? text = null;

if (text == null)
{
Console.WriteLine("textはnullです。");
}

== nullは直感的でわかりやすく、多くのC#コードで使われています。

nullではないことを判定したい場合は、次のように書きます。

C#
if (text != null)
{
Console.WriteLine(text.Length);
}

このように、nullでないことを確認してからLengthなどを呼び出せば、NullReferenceExceptionを防げます。

ただし、== nullはあくまでnullだけを判定します。空文字はnullではないため、次のコードでは条件に入りません。

C#
string text = "";

if (text == null)
{
Console.WriteLine("nullです。");
}
else
{
Console.WriteLine("nullではありません。");
}

この場合、空文字は「nullではない」と判定されます。

2-2. is nullで判定する

C#では、is nullを使ってnull判定を行うこともできます。

C#
string? text = null;

if (text is null)
{
Console.WriteLine("textはnullです。");
}

is nullはパターンマッチングを使った書き方です。意味としては、変数がnullかどうかを判定します。

nullではないことを判定する場合は、is not nullを使います。

C#
if (text is not null)
{
Console.WriteLine(text.Length);
}

is not nullは、近年のC#コードでよく使われる読みやすい書き方です。

C#
string? name = "Alice";

if (name is not null)
{
Console.WriteLine($"名前: {name}");
}

== nullでもis nullでも、文字列のnull判定としては問題なく使えます。チームのコーディングルールやプロジェクトの書き方に合わせるとよいでしょう。

2-3. null条件演算子(?.)を使う

null条件演算子?.を使うと、対象がnullでない場合だけプロパティやメソッドを呼び出せます。

C#
string? text = null;

int? length = text?.Length;

Console.WriteLine(length); // null

textがnullの場合、text?.Lengthは例外を出さずにnullを返します。textがnullでなければ、通常どおりLengthが取得されます。

C#
string? text = "Hello";

int? length = text?.Length;

Console.WriteLine(length); // 5

null条件演算子は、メソッド呼び出しにも使えます。

C#
string? text = null;

string? trimmed = text?.Trim();

この場合、textがnullならTrim()は呼び出されず、trimmedにはnullが入ります。

ただし、空文字かどうかを判定したい場合に?.Length == 0だけを使うと、nullと空文字を同じようには扱えません。

C#
string? text = null;

if (text?.Length == 0)
{
Console.WriteLine("空文字です。");
}

このコードでは、textがnullの場合は条件がfalseになります。nullも空文字もまとめて判定したい場合は、string.IsNullOrEmptyを使う方がわかりやすいです。

2-4. null合体演算子(??)を使う

null合体演算子??を使うと、左辺がnullの場合に別の値を返せます。

C#
string? text = null;

string result = text ?? "デフォルト値";

Console.WriteLine(result); // デフォルト値

textがnullでなければ、その値がそのまま使われます。

C#
string? text = "Hello";

string result = text ?? "デフォルト値";

Console.WriteLine(result); // Hello

null合体演算子は、nullの場合に空文字へ変換したいときにも使えます。

C#
string? text = null;

string safeText = text ?? "";

Console.WriteLine(safeText.Length); // 0

また、string.Emptyを使って書くこともできます。

C#
string safeText = text ?? string.Empty;

null合体演算子は、nullを別の値に置き換えて安全に処理を続けたい場合に便利です。

3. C#で空文字を判定する方法

3-1. == ""で判定する

C#で空文字を判定する基本的な方法は、== ""を使う書き方です。

C#
string text = "";

if (text == "")
{
Console.WriteLine("空文字です。");
}

この書き方はシンプルで、空文字かどうかが直感的にわかります。

ただし、== ""は空文字だけを判定します。nullは空文字ではないため、次のコードではtrueになりません。

C#
string? text = null;

if (text == "")
{
Console.WriteLine("空文字です。");
}
else
{
Console.WriteLine("空文字ではありません。");
}

この場合、textはnullなので、text == ""はfalseになります。

nullと空文字をまとめて判定したい場合は、string.IsNullOrEmptyを使う方が安全です。

3-2. string.Emptyで判定する

空文字はstring.Emptyでも表せます。

C#
string text = string.Empty;

if (text == string.Empty)
{
Console.WriteLine("空文字です。");
}

string.Emptyは、""と同じく空文字を表します。

C#
string text1 = "";
string text2 = string.Empty;

Console.WriteLine(text1 == text2); // true

""string.Emptyのどちらを使うべきかは、プロジェクトやチームの方針によって異なります。

短く書きたい場合は""、明示的に空文字であることを表したい場合はstring.Emptyが使われることがあります。

ただし、どちらを使ってもnullは判定できません。

C#
string? text = null;

Console.WriteLine(text == string.Empty); // false

nullも含めてチェックしたい場合は、string.IsNullOrEmpty(text)を使いましょう。

3-3. Length == 0で判定する

文字列の長さを表すLengthを使って、空文字かどうかを判定することもできます。

C#
string text = "";

if (text.Length == 0)
{
Console.WriteLine("空文字です。");
}

空文字の長さは0なので、Length == 0で判定できます。

通常の文字列の場合は、文字数が入ります。

C#
string text = "Hello";

Console.WriteLine(text.Length); // 5

ただし、Lengthを使う場合は、変数がnullでないことが前提です。

C#
string? text = null;

if (text.Length == 0)
{
Console.WriteLine("空文字です。");
}

このコードは、textがnullのためNullReferenceExceptionが発生します。

そのため、Length == 0を使う場合は、事前にnullチェックを行う必要があります。

C#
string? text = null;

if (text is not null && text.Length == 0)
{
Console.WriteLine("空文字です。");
}

とはいえ、nullと空文字をまとめて判定したいだけなら、string.IsNullOrEmptyを使う方が簡潔です。

3-4. 空文字判定で注意すべきポイント

空文字判定で注意したいのは、空文字と空白文字は違うという点です。

C#
string text1 = "";
string text2 = " ";

text1は空文字ですが、text2は半角スペースが1文字入っている文字列です。

そのため、次の判定結果は異なります。

C#
Console.WriteLine(text1 == ""); // true
Console.WriteLine(text2 == ""); // false

Lengthで見ても違いがあります。

C#
Console.WriteLine(text1.Length); // 0
Console.WriteLine(text2.Length); // 1

ユーザー入力では、見た目上は未入力に見えても、実際にはスペースだけが入力されているケースがあります。

C#
string input = "   ";

if (string.IsNullOrEmpty(input))
{
Console.WriteLine("未入力です。");
}
else
{
Console.WriteLine("入力されています。");
}

この場合、inputにはスペースが入っているため、IsNullOrEmptyではfalseになります。

空白文字だけの入力も未入力として扱いたい場合は、string.IsNullOrWhiteSpaceを使います。

C#
if (string.IsNullOrWhiteSpace(input))
{
Console.WriteLine("未入力です。");
}

空文字だけをチェックしたいのか、空白文字も未入力扱いにしたいのかを明確にして使い分けることが大切です。

4. string.IsNullOrEmptyの使い方

4-1. IsNullOrEmptyとは

string.IsNullOrEmptyは、文字列がnullまたは空文字かどうかを判定するためのメソッドです。

C#
string.IsNullOrEmpty(value)

このメソッドは、引数に渡した文字列が次のどちらかに当てはまる場合にtrueを返します。

C#
null
""

つまり、nullチェックと空文字チェックをまとめて行えます。

C#
string? text = null;

if (string.IsNullOrEmpty(text))
{
Console.WriteLine("nullまたは空文字です。");
}

C#で文字列の未設定や未入力を判定する場合、もっともよく使われる方法のひとつです。

4-2. 基本的な書き方

string.IsNullOrEmptyの基本的な書き方は次のとおりです。

C#
string? text = "";

if (string.IsNullOrEmpty(text))
{
Console.WriteLine("textはnullまたは空文字です。");
}
else
{
Console.WriteLine("textには文字が入っています。");
}

メソッドの戻り値はboolです。

C#
bool result = string.IsNullOrEmpty(text);

trueの場合はnullまたは空文字、falseの場合は1文字以上の文字列が入っていることを意味します。

よくある使い方は、入力値のチェックです。

C#
string? userName = "";

if (string.IsNullOrEmpty(userName))
{
Console.WriteLine("ユーザー名を入力してください。");
return;
}

Console.WriteLine($"こんにちは、{userName}さん");

このように、処理の最初でチェックしておくと、その後のコードを安全に書きやすくなります。

4-3. nullの場合の判定結果

引数がnullの場合、string.IsNullOrEmptytrueを返します。

C#
string? text = null;

Console.WriteLine(string.IsNullOrEmpty(text)); // true

string.IsNullOrEmptyはnullを安全に扱えるため、次のように事前のnullチェックは不要です。

C#
string? text = null;

if (string.IsNullOrEmpty(text))
{
Console.WriteLine("値がありません。");
}

text.Length == 0のように書くと、textがnullの場合にエラーになります。

C#
string? text = null;

// Console.WriteLine(text.Length == 0); // エラー

その点、string.IsNullOrEmptyはnullの可能性がある文字列にも安全に使えます。

4-4. 空文字の場合の判定結果

引数が空文字の場合も、string.IsNullOrEmptytrueを返します。

C#
string text = "";

Console.WriteLine(string.IsNullOrEmpty(text)); // true

string.Emptyの場合も同じです。

C#
string text = string.Empty;

Console.WriteLine(string.IsNullOrEmpty(text)); // true

つまり、次の2つはどちらもtrueです。

C#
Console.WriteLine(string.IsNullOrEmpty(null)); // true
Console.WriteLine(string.IsNullOrEmpty("")); // true

nullか空文字かを区別せず、「値がない」とまとめて扱いたい場合に便利です。

4-5. 通常の文字列の場合の判定結果

通常の文字列が入っている場合、string.IsNullOrEmptyfalseを返します。

C#
string text = "Hello";

Console.WriteLine(string.IsNullOrEmpty(text)); // false

日本語の文字列でも同じです。

C#
string text = "こんにちは";

Console.WriteLine(string.IsNullOrEmpty(text)); // false

ただし、スペースだけの文字列は空文字ではありません。

C#
string text = " ";

Console.WriteLine(string.IsNullOrEmpty(text)); // false

半角スペースが1文字入っているため、文字列としては空ではないと判定されます。

空白だけの文字列も未入力扱いにしたい場合は、string.IsNullOrWhiteSpaceを使います。

5. IsNullOrEmptyと他の判定方法の違い

5-1. IsNullOrEmptyと== nullの違い

== nullは、文字列がnullかどうかだけを判定します。

C#
string? text = "";

Console.WriteLine(text == null); // false

空文字はnullではないため、== nullではfalseになります。

一方、string.IsNullOrEmptyはnullと空文字の両方を判定します。

C#
string? text = "";

Console.WriteLine(string.IsNullOrEmpty(text)); // true

違いをまとめると、次のようになります。

C#
string? value1 = null;
string value2 = "";

Console.WriteLine(value1 == null); // true
Console.WriteLine(value2 == null); // false

Console.WriteLine(string.IsNullOrEmpty(value1)); // true
Console.WriteLine(string.IsNullOrEmpty(value2)); // true

nullだけを判定したい場合は== nullis nullで十分です。

しかし、nullと空文字の両方を「値がない」として扱いたい場合は、string.IsNullOrEmptyを使う方が適しています。

5-2. IsNullOrEmptyと== ""の違い

== ""は、文字列が空文字かどうかだけを判定します。

C#
string text = "";

Console.WriteLine(text == ""); // true

しかし、nullの場合はtrueになりません。

C#
string? text = null;

Console.WriteLine(text == ""); // false

一方、string.IsNullOrEmptyはnullでも空文字でもtrueになります。

C#
string? value1 = null;
string value2 = "";

Console.WriteLine(string.IsNullOrEmpty(value1)); // true
Console.WriteLine(string.IsNullOrEmpty(value2)); // true

== ""は「空文字だけ」を明確に判定したい場合には使えますが、実務ではnullの可能性もあるケースが多いため、IsNullOrEmptyの方が安全に使いやすいです。

5-3. IsNullOrEmptyとstring.Empty比較の違い

string.Emptyとの比較は、== ""とほぼ同じ意味です。

C#
string text = string.Empty;

Console.WriteLine(text == string.Empty); // true

ただし、これも空文字だけを判定する方法です。nullは判定できません。

C#
string? text = null;

Console.WriteLine(text == string.Empty); // false

一方、string.IsNullOrEmptyはnullと空文字の両方を判定します。

C#
string? text = null;

Console.WriteLine(string.IsNullOrEmpty(text)); // true

空文字だけを厳密に判定したい場合は、text == string.Emptyでも構いません。

しかし、入力チェックやデータ取得後のチェックでは、nullも空文字も同じように扱うことが多いため、string.IsNullOrEmptyを使う場面が多いです。

5-4. 可読性と安全性の違い

可読性と安全性の面でも、string.IsNullOrEmptyは使いやすい方法です。

たとえば、nullと空文字を両方チェックしようとして、次のように書くこともできます。

C#
if (text == null || text == "")
{
Console.WriteLine("値がありません。");
}

このコードでも動作しますが、string.IsNullOrEmptyを使うとより簡潔になります。

C#
if (string.IsNullOrEmpty(text))
{
Console.WriteLine("値がありません。");
}

読み手にとっても、「nullまたは空文字を判定している」とすぐにわかります。

また、Length == 0のような書き方と違い、nullでも例外が発生しません。

C#
if (text != null && text.Length == 0)
{
Console.WriteLine("空文字です。");
}

このように書くよりも、nullと空文字をまとめて扱うなら次の方が実務では読みやすいです。

C#
if (string.IsNullOrEmpty(text))
{
Console.WriteLine("値がありません。");
}

安全性と可読性の両方を考えると、null・空文字チェックではstring.IsNullOrEmptyが基本の選択肢になります。

6. IsNullOrWhiteSpaceとの違い

6-1. IsNullOrWhiteSpaceとは

string.IsNullOrWhiteSpaceは、文字列がnull、空文字、または空白文字だけで構成されているかを判定するメソッドです。

C#
string.IsNullOrWhiteSpace(value)

次のような値の場合にtrueを返します。

C#
null
""
" "
" "
"\t"
"\n"

たとえば、次のコードではすべてtrueになります。

C#
Console.WriteLine(string.IsNullOrWhiteSpace(null));  // true
Console.WriteLine(string.IsNullOrWhiteSpace("")); // true
Console.WriteLine(string.IsNullOrWhiteSpace(" ")); // true
Console.WriteLine(string.IsNullOrWhiteSpace(" ")); // true

IsNullOrEmptyとの大きな違いは、空白文字だけの文字列もtrueにする点です。

C#
Console.WriteLine(string.IsNullOrEmpty(" "));      // false
Console.WriteLine(string.IsNullOrWhiteSpace(" ")); // true

ユーザー入力の未入力チェックでは、IsNullOrWhiteSpaceの方が実用的な場面も多いです。

6-2. 半角スペース・全角スペースの判定

IsNullOrWhiteSpaceは、半角スペースだけの文字列をtrueと判定します。

C#
string text = " ";

Console.WriteLine(string.IsNullOrWhiteSpace(text)); // true

一方、IsNullOrEmptyではfalseになります。

C#
Console.WriteLine(string.IsNullOrEmpty(text)); // false

半角スペースは1文字の文字列なので、空文字ではないためです。

また、全角スペースだけの文字列も空白文字として扱われます。

C#
string text = " ";

Console.WriteLine(string.IsNullOrWhiteSpace(text)); // true

見た目上は何も入力されていないように見える場合でも、実際にはスペースが含まれているケースがあります。

フォーム入力では、ユーザーが誤ってスペースだけを入力することもあるため、未入力チェックではIsNullOrWhiteSpaceを使うと便利です。

6-3. タブや改行を含む文字列の判定

IsNullOrWhiteSpaceは、スペースだけでなく、タブや改行などの空白文字も判定できます。

C#
string tab = "\t";
string newLine = "\n";
string spaces = "\r\n";

Console.WriteLine(string.IsNullOrWhiteSpace(tab)); // true
Console.WriteLine(string.IsNullOrWhiteSpace(newLine)); // true
Console.WriteLine(string.IsNullOrWhiteSpace(spaces)); // true

一方、IsNullOrEmptyではこれらは空文字ではないためfalseになります。

C#
Console.WriteLine(string.IsNullOrEmpty("\t")); // false
Console.WriteLine(string.IsNullOrEmpty("\n")); // false

複数行入力やテキストエリアの内容をチェックする場合、改行だけが入力されているケースもあります。

C#
string comment = "\n\n";

if (string.IsNullOrWhiteSpace(comment))
{
Console.WriteLine("コメントを入力してください。");
}

このようなケースでは、IsNullOrWhiteSpaceを使うことで、空白だけの入力を未入力として扱えます。

6-4. IsNullOrEmptyとIsNullOrWhiteSpaceの使い分け

IsNullOrEmptyIsNullOrWhiteSpaceは、目的に応じて使い分けます。

nullまたは空文字だけをチェックしたい場合は、IsNullOrEmptyを使います。

C#
if (string.IsNullOrEmpty(value))
{
Console.WriteLine("nullまたは空文字です。");
}

空白だけの文字列も未入力として扱いたい場合は、IsNullOrWhiteSpaceを使います。

C#
if (string.IsNullOrWhiteSpace(value))
{
Console.WriteLine("未入力です。");
}

たとえば、ユーザー名やメールアドレスなど、スペースだけの入力を許可したくない項目ではIsNullOrWhiteSpaceが適しています。

C#
if (string.IsNullOrWhiteSpace(userName))
{
Console.WriteLine("ユーザー名を入力してください。");
}

一方で、スペース自体に意味があるデータを扱う場合は、IsNullOrEmptyを使った方がよいこともあります。

たとえば、テキストの整形処理や固定長データなどでは、スペースを有効な文字として扱うケースがあります。

基本的には、入力チェックではIsNullOrWhiteSpace、データとして空文字だけを判定したい場合はIsNullOrEmptyと考えるとわかりやすいです。

7. 実務でよく使うnull・空文字チェックの例

7-1. 入力フォームの未入力チェック

入力フォームでは、ユーザーが値を入力していない場合にエラーメッセージを表示する処理がよくあります。

C#
string? userName = form.UserName;

if (string.IsNullOrWhiteSpace(userName))
{
Console.WriteLine("ユーザー名を入力してください。");
return;
}

Console.WriteLine($"登録するユーザー名: {userName}");

ユーザー入力では、空文字だけでなくスペースだけが入力されることもあります。

そのため、フォームの未入力チェックではstring.IsNullOrWhiteSpaceを使うことが多いです。

メールアドレスのチェックでも同じように使えます。

C#
string? email = form.Email;

if (string.IsNullOrWhiteSpace(email))
{
Console.WriteLine("メールアドレスを入力してください。");
return;
}

この段階では、あくまで「未入力かどうか」をチェックしています。メールアドレスの形式が正しいかどうかは、別のバリデーションで確認します。

7-2. APIレスポンスの文字列チェック

APIから取得した値は、nullになっている可能性があります。

C#
string? accessToken = response.AccessToken;

if (string.IsNullOrEmpty(accessToken))
{
Console.WriteLine("アクセストークンが取得できませんでした。");
return;
}

APIレスポンスでは、項目自体が存在しない場合や、値が空文字で返ってくる場合があります。

そのため、nullと空文字をまとめてチェックできるIsNullOrEmptyが便利です。

レスポンスメッセージを表示する場合は、null合体演算子を使ってデフォルト値を設定することもできます。

C#
string message = response.Message ?? "メッセージはありません。";

Console.WriteLine(message);

空文字もデフォルト値に置き換えたい場合は、IsNullOrEmptyを使います。

C#
string message = string.IsNullOrEmpty(response.Message)
? "メッセージはありません。"
: response.Message;

Console.WriteLine(message);

APIから取得した値は必ず入っているとは限らないため、処理の前にチェックしておくことが重要です。

7-3. データベースから取得した値のチェック

データベースの文字列項目は、設計によってnullを許可している場合があります。

C#
string? phoneNumber = user.PhoneNumber;

if (string.IsNullOrEmpty(phoneNumber))
{
Console.WriteLine("電話番号は登録されていません。");
}
else
{
Console.WriteLine($"電話番号: {phoneNumber}");
}

データベース上でNULLが許可されている列では、C#側でもnullとして扱う必要があります。

また、空文字で保存されているケースもあります。

C#
string? address = user.Address;

if (string.IsNullOrWhiteSpace(address))
{
Console.WriteLine("住所は未登録です。");
}

住所や氏名など、スペースだけでは意味がない項目ではIsNullOrWhiteSpaceを使うとよいでしょう。

一方で、システム内部のコードや識別子など、空白をデータとして扱わない項目では、保存前に空白を除去する設計にすることもあります。

C#
user.Name = inputName?.Trim();

if (string.IsNullOrEmpty(user.Name))
{
Console.WriteLine("名前を入力してください。");
}

ただし、Trim()を使う場合は、対象がnullでないかに注意が必要です。

7-4. 条件分岐でエラーを防ぐ書き方

nullや空文字のチェックは、条件分岐でエラーを防ぐためにも重要です。

たとえば、文字列の先頭3文字を取得する処理があるとします。

C#
string? code = GetCode();

if (!string.IsNullOrEmpty(code) && code.Length >= 3)
{
string prefix = code.Substring(0, 3);
Console.WriteLine(prefix);
}

先にIsNullOrEmptyでチェックすることで、code.LengthSubstringを安全に呼び出せます。

より空白にも厳しくするなら、次のように書けます。

C#
string? code = GetCode();

if (!string.IsNullOrWhiteSpace(code) && code.Length >= 3)
{
string prefix = code.Substring(0, 3);
Console.WriteLine(prefix);
}

また、処理の先頭で不正な値を弾く書き方もよく使われます。

C#
void PrintName(string? name)
{
if (string.IsNullOrWhiteSpace(name))
{
Console.WriteLine("名前が指定されていません。");
return;
}

Console.WriteLine($"名前: {name}");
}

このように、早い段階でnullや空文字をチェックしておくと、その後の処理をシンプルに書けます。

8. null・空文字判定でよくあるエラーと注意点

8-1. nullのままLengthを呼び出すエラー

C#でよくあるエラーのひとつが、nullの文字列に対してLengthを呼び出してしまうケースです。

C#
string? text = null;

if (text.Length == 0)
{
Console.WriteLine("空文字です。");
}

このコードは、textがnullのためNullReferenceExceptionが発生します。

Lengthを使いたい場合は、先にnullチェックを行います。

C#
if (text is not null && text.Length == 0)
{
Console.WriteLine("空文字です。");
}

ただし、nullまたは空文字を判定したいだけなら、次のように書く方が安全です。

C#
if (string.IsNullOrEmpty(text))
{
Console.WriteLine("nullまたは空文字です。");
}

IsNullOrEmptyはnullでも例外を出さずに判定できるため、実務ではこちらを使う方がわかりやすいです。

8-2. 空白文字を空文字として扱ってしまうケース

空文字と空白文字は違います。

C#
string empty = "";
string space = " ";

emptyは文字数0ですが、spaceは半角スペース1文字の文字列です。

そのため、IsNullOrEmptyでは判定結果が異なります。

C#
Console.WriteLine(string.IsNullOrEmpty(empty)); // true
Console.WriteLine(string.IsNullOrEmpty(space)); // false

ユーザー入力では、スペースだけを入力して送信されることがあります。

C#
string input = "   ";

if (string.IsNullOrEmpty(input))
{
Console.WriteLine("未入力です。");
}
else
{
Console.WriteLine("入力されています。");
}

この場合、IsNullOrEmptyではfalseになり、「入力されている」と判定されます。

空白だけの入力を未入力として扱いたい場合は、IsNullOrWhiteSpaceを使いましょう。

C#
if (string.IsNullOrWhiteSpace(input))
{
Console.WriteLine("未入力です。");
}

入力チェックでは、空文字だけでなく空白文字も考慮することが大切です。

8-3. Trim()と組み合わせるときの注意

文字列の前後の空白を取り除くために、Trim()を使うことがあります。

C#
string text = "  Hello  ";

string trimmed = text.Trim();

Console.WriteLine(trimmed); // Hello

ただし、対象の文字列がnullの場合、Trim()を呼び出すとエラーになります。

C#
string? text = null;

string trimmed = text.Trim(); // エラー

nullの可能性がある場合は、null条件演算子を使うと安全です。

C#
string? text = null;

string? trimmed = text?.Trim();

そのうえで、nullや空文字をチェックできます。

C#
if (string.IsNullOrEmpty(text?.Trim()))
{
Console.WriteLine("値がありません。");
}

ただし、空白だけの文字列を未入力として扱いたいだけなら、Trim()IsNullOrEmptyを組み合わせるより、IsNullOrWhiteSpaceを使う方が簡潔です。

C#
if (string.IsNullOrWhiteSpace(text))
{
Console.WriteLine("値がありません。");
}

Trim()は文字列を加工したいときに使い、判定だけならIsNullOrWhiteSpaceを優先すると読みやすくなります。

8-4. Nullable Reference Types使用時の注意

C#では、Nullable Reference Typesを有効にすると、参照型のnull可能性をコード上で表現できます。

C#
string name = "Alice";
string? nullableName = null;

stringは基本的にnullを想定しない文字列、string?はnullの可能性がある文字列として扱います。

C#
string? text = GetText();

Console.WriteLine(text.Length); // 警告が出る可能性がある

textはnullの可能性があるため、そのままLengthを呼び出すと警告されます。

次のようにnullチェックを行うと、安全に扱えます。

C#
if (text is not null)
{
Console.WriteLine(text.Length);
}

または、IsNullOrEmptyでチェックすることもできます。

C#
if (!string.IsNullOrEmpty(text))
{
Console.WriteLine(text.Length);
}

この場合、条件の中ではtextに文字列が入っていると判断しやすくなります。

Nullable Reference Typesを使うと、nullによるエラーをコンパイル時に見つけやすくなります。ただし、警告を無視してしまうと実行時エラーにつながるため、nullの可能性がある値は適切にチェックすることが大切です。

9. C#のnull・空文字判定はどれを使うべきか

9-1. 基本はIsNullOrEmptyを使う

C#でnullまたは空文字を判定したい場合、基本的にはstring.IsNullOrEmptyを使うのがおすすめです。

C#
if (string.IsNullOrEmpty(value))
{
Console.WriteLine("値がありません。");
}

理由は、nullと空文字をまとめて安全に判定できるからです。

次のように個別に書くこともできます。

C#
if (value == null || value == "")
{
Console.WriteLine("値がありません。");
}

しかし、IsNullOrEmptyを使った方が簡潔で、意図も伝わりやすくなります。

C#
if (string.IsNullOrEmpty(value))
{
Console.WriteLine("値がありません。");
}

「nullまたは空文字なら処理を止める」という場面では、IsNullOrEmptyを第一候補にするとよいでしょう。

9-2. 空白も未入力扱いにするならIsNullOrWhiteSpace

ユーザー入力のチェックでは、空白だけの文字列も未入力として扱いたいことが多いです。

その場合は、string.IsNullOrWhiteSpaceを使います。

C#
if (string.IsNullOrWhiteSpace(input))
{
Console.WriteLine("入力してください。");
}

たとえば、次のような入力はすべて未入力として扱えます。

C#
null
""
" "
" "
"\t"
"\n"

フォーム入力、検索キーワード、コメント、名前、メールアドレスなどでは、スペースだけの入力を有効な値として扱わないことが多いです。

そのため、ユーザーが直接入力する値では、IsNullOrWhiteSpaceを使う場面が多くなります。

C#
if (string.IsNullOrWhiteSpace(userName))
{
Console.WriteLine("ユーザー名を入力してください。");
}

一方で、スペースを意味のあるデータとして扱う場合は、IsNullOrEmptyとの使い分けが必要です。

9-3. nullだけを判定したい場合

nullだけを判定したい場合は、is nullまたは== nullを使います。

C#
if (value is null)
{
Console.WriteLine("nullです。");
}

または、次のように書けます。

C#
if (value == null)
{
Console.WriteLine("nullです。");
}

nullではないことを確認したい場合は、is not nullが読みやすいです。

C#
if (value is not null)
{
Console.WriteLine(value.Length);
}

nullだけを特別扱いし、空文字は有効な値として扱いたい場合には、IsNullOrEmptyではなくnull判定だけを使います。

C#
string? value = "";

if (value is null)
{
Console.WriteLine("値が存在しません。");
}
else
{
Console.WriteLine("値は存在します。");
}

この場合、空文字はnullではないため「値は存在します」と判定されます。

システム上、nullと空文字を区別したい場合は、どちらを判定しているのかを明確にすることが重要です。

9-4. チーム開発で統一したい書き方

チーム開発では、null・空文字判定の書き方を統一しておくと、コードの読みやすさが上がります。

たとえば、次のようなルールを決めておくとよいでしょう。

C#
// nullまたは空文字を判定する
string.IsNullOrEmpty(value)

// null、空文字、空白のみを判定する
string.IsNullOrWhiteSpace(value)

// nullだけを判定する
value is null

// nullではないことを判定する
value is not null

同じ意味の判定が、場所によってバラバラに書かれていると、コードレビューや保守の負担が増えます。

C#
if (value == null || value == "")
{
}

if (string.IsNullOrEmpty(value))
{
}

if (value is null || value.Length == 0)
{
}

これらは似たような目的で使われることがありますが、書き方が統一されていないと意図を読み取りにくくなります。

基本的には、nullと空文字をまとめて判定するならIsNullOrEmpty、空白も含めるならIsNullOrWhiteSpace、nullだけならis nullのように統一するとわかりやすいです。

チームでコーディング規約を決めておくことで、C#のnull・空文字判定に関するミスを減らせます。

まとめ

C#で文字列を扱うときは、nullと空文字の違いを理解しておくことが重要です。

nullは値そのものが存在しない状態で、空文字は文字数が0の文字列です。

C#
string? value1 = null;
string value2 = "";

nullだけを判定したい場合は、== nullis nullを使います。

C#
if (value is null)
{
Console.WriteLine("nullです。");
}

空文字だけを判定したい場合は、== ""string.EmptyLength == 0などを使えます。

C#
if (value == "")
{
Console.WriteLine("空文字です。");
}

ただし、nullと空文字をまとめて判定したい場合は、string.IsNullOrEmptyを使うのが基本です。

C#
if (string.IsNullOrEmpty(value))
{
Console.WriteLine("nullまたは空文字です。");
}

さらに、スペースやタブ、改行だけの文字列も未入力として扱いたい場合は、string.IsNullOrWhiteSpaceを使います。

C#
if (string.IsNullOrWhiteSpace(value))
{
Console.WriteLine("未入力です。");
}

実務では、入力フォームやAPIレスポンス、データベースから取得した値など、nullや空文字をチェックする場面が多くあります。

迷った場合は、次のように使い分けるとよいでしょう。

C#
// nullまたは空文字をチェック
string.IsNullOrEmpty(value)

// null、空文字、空白のみをチェック
string.IsNullOrWhiteSpace(value)

// nullだけをチェック
value is null

C#で安全に文字列を扱うためには、null・empty・空白文字の違いを理解し、目的に合った判定方法を選ぶことが大切です。