C# Tips | 文字列操作:文字列が空か判定する

Web APP C#
スポンサーリンク
スポンサーリンク

C#でnullまたは空文字を判定する方法

C#で業務システムを開発していると、入力値や設定値などの文字列が「存在するのか」「何も入っていないのか」を確認する処理が頻繁に登場します。

たとえば、ユーザーが入力した名前、検索キーワード、ファイルパス、設定値、データベースから取得した値などです。

このとき特に重要なのが、次の2つを区別することです。

  • null:文字列そのものが存在しない
  • "":文字列は存在するが、文字数が0

C#には、この2つをまとめて判定するための便利なメソッドが用意されています。

それがstring.IsNullOrEmpty()です。

この記事では、string.IsNullOrEmpty()の基本から、実務での使い方、IsNullOrWhiteSpace()との違い、よくある間違い、安全な入力チェックの考え方まで、初心者向けに順番に説明します。

まずnullと空文字の違いを理解する

最初に、nullと空文字列の違いを理解しましょう。

次のコードを見てください。

// nullは「値が存在しない」状態
string? value1 = null;

// 空文字列は「文字列は存在するが、文字が0個」の状態
string value2 = "";

// 文字が入っている通常の文字列
string value3 = "C#";
C#

それぞれの状態をイメージすると、次のようになります。

値意味
null文字列そのものが存在しない
""文字列は存在するが文字数が0
"C#"文字列が存在し、文字が入っている

プログラミング初心者にとっては、nullと""はどちらも「何もない」と考えてしまいやすいところです。

しかし、C#では明確に別の状態です。

nullは「文字列がない」

nullは、簡単にいうと「参照先となる値が存在しない」という状態です。

// nullを設定する
string? name = null;

// nameには文字列が存在しません。
C#

この状態で、文字列のLengthを取得しようとすると問題になります。

string? name = null;

// nullなのでLengthを取得できません。
// NullReferenceExceptionの原因になります。
int length = name.Length;
C#

そのため、nullになる可能性がある文字列を扱う場合には、適切なチェックが必要です。

空文字は「文字数が0」

一方、空文字列は次のような値です。

// 空文字列
string name = "";

// 文字列自体は存在しています。
// ただし、文字数は0です。
Console.WriteLine(name.Length); // 0
C#

つまり、次の2つは似ていますが、C#では別物です。

// 文字列が存在しない
string? value1 = null;

// 文字列は存在するが、文字が0個
string value2 = "";
C#

string.IsNullOrEmptyとは

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

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

string? value = null;

// nullまたは空文字列ならtrueになります。
if (string.IsNullOrEmpty(value))
{
    Console.WriteLine("値がありません。");
}
else
{
    Console.WriteLine("値が入力されています。");
}
C#

このメソッドのポイントは、nullと空文字列を1回の判定でチェックできることです。

たとえば、次のようなコードを書くこともできます。

string? value = GetValue();

// nullまたは空文字列かチェックする
if (value == null || value == "")
{
    Console.WriteLine("値がありません。");
}
C#

これをstring.IsNullOrEmpty()を使えば、次のように簡潔にできます。

string? value = GetValue();

// nullまたは空文字列かチェックする
if (string.IsNullOrEmpty(value))
{
    Console.WriteLine("値がありません。");
}
C#

実務では、このような標準メソッドを利用するほうが、コードを読む人にも「nullまたは空文字をチェックしている」という意図が伝わりやすくなります。

string.IsNullOrEmptyの戻り値

string.IsNullOrEmpty()は、判定結果としてboolを返します。

boolは、trueまたはfalseを表す型です。

たとえば次のコードです。

// nullを設定する
string? value = null;

// 判定結果をbool型の変数に保存する
bool result = string.IsNullOrEmpty(value);

// 結果を表示する
Console.WriteLine(result); // True
C#

空文字列の場合もtrueになります。

// 空文字列を設定する
string value = "";

// nullまたは空文字列か判定する
bool result = string.IsNullOrEmpty(value);

Console.WriteLine(result); // True
C#

一方、文字列が入っていればfalseになります。

// 文字列を設定する
string value = "C#";

// nullまたは空文字列か判定する
bool result = string.IsNullOrEmpty(value);

Console.WriteLine(result); // False
C#

基本的なif文での使い方

実務では、判定結果を変数に保存するより、if文の条件式に直接書くことが多いです。

string? name = GetUserName();

// nullまたは空文字列の場合
if (string.IsNullOrEmpty(name))
{
    Console.WriteLine("名前が入力されていません。");
}
else
{
    Console.WriteLine($"名前:{name}");
}
C#

このコードは、次のような流れになっています。

  1. 名前を取得する
  2. string.IsNullOrEmpty()でチェックする
  3. nullまたは空文字列ならエラー処理を行う
  4. それ以外なら通常処理を行う

この「最初に入力値を検証してから処理する」という考え方は、業務プログラムで非常に重要です。

初心者向けの基本テンプレート

まずは次のテンプレートを覚えておくと便利です。

// 文字列を取得する
string? value = GetValue();

// nullまたは空文字列か確認する
if (string.IsNullOrEmpty(value))
{
    // 値がない場合の処理
    Console.WriteLine("値を入力してください。");

    // 必要に応じて処理を終了する
    return;
}

// ここから先は値が入力されている場合の処理
Console.WriteLine($"入力値:{value}");
C#

業務システムでは、このような「不正な状態を早めに処理する」書き方がよく使われます。

ユーザー入力をチェックする例

コンソールアプリケーションで、ユーザーに名前を入力してもらう例を見てみましょう。

Console.Write("名前を入力してください:");

// ユーザーが入力した文字列を取得する
// ReadLine()はnullを返す可能性があるためstring?にする
string? name = Console.ReadLine();

// nullまたは空文字列かチェックする
if (string.IsNullOrEmpty(name))
{
    Console.WriteLine("名前が入力されていません。");
    return;
}

// 入力されている場合の処理
Console.WriteLine($"こんにちは、{name}さん。");
C#

たとえば、何も入力せずEnterキーを押した場合、空文字列になる可能性があります。

その場合、string.IsNullOrEmpty(name)によって未入力として処理できます。

IsNullOrEmptyでは空白文字は判定できない

ここは実務で特に注意したいポイントです。

次の文字列を考えてみましょう。

// 半角スペースが3つ入っている
string value = "   ";

// nullまたは空文字列か判定する
if (string.IsNullOrEmpty(value))
{
    Console.WriteLine("空です。");
}
else
{
    Console.WriteLine("空ではありません。");
}
C#

この場合、結果は「空ではありません」です。

なぜなら、" "は空文字列ではないからです。

文字数を数えると3文字あります。

string value = "   ";

// スペースも文字として数えられる
Console.WriteLine(value.Length); // 3
C#

つまり、string.IsNullOrEmpty()は次の判定を行います。

  • null → true
  • "" → true
  • " " → false
  • "abc" → false

空白も未入力として扱うならIsNullOrWhiteSpace

ユーザー入力では、「スペースだけ入力された場合も未入力として扱いたい」ということがあります。

その場合は、string.IsNullOrWhiteSpace()を使用します。

// スペースだけの文字列
string value = "   ";

// null、空文字列、空白だけの文字列をチェックする
if (string.IsNullOrWhiteSpace(value))
{
    Console.WriteLine("値が入力されていません。");
}
C#

このメソッドを使うと、空白文字だけの入力も検出できます。

2つのメソッドの違いを整理すると、次のようになります。

値IsNullOrEmptyIsNullOrWhiteSpace
nulltruetrue
""truetrue
" "falsetrue
"C#"falsefalse
" C# "falsefalse

そのため、ユーザー入力の必須チェックでは、要件に応じてIsNullOrWhiteSpace()を使うケースが多くあります。

IsNullOrEmptyとIsNullOrWhiteSpaceの使い分け

IsNullOrEmptyを使うケース

「nullまたは文字数0であること」を確認したい場合は、IsNullOrEmpty()を使います。

string? value = GetValue();

// nullまたは空文字列の場合
if (string.IsNullOrEmpty(value))
{
    Console.WriteLine("値がありません。");
}
C#

たとえば、データ処理の中で「値が存在するか」を確認したい場合などに使えます。

IsNullOrWhiteSpaceを使うケース

「空白だけの入力も空として扱う」という要件なら、IsNullOrWhiteSpace()を使用します。

string? name = GetUserName();

// null、空文字列、空白だけなら未入力として扱う
if (string.IsNullOrWhiteSpace(name))
{
    Console.WriteLine("名前を入力してください。");
}
C#

ユーザーが入力フォームに何かを入力する場面では、こちらの判定が適していることがあります。

Lengthで空文字を判定する方法が危険な理由

初心者の方は、次のように書きたくなるかもしれません。

string? value = GetValue();

// 文字数が0かチェックする
if (value.Length == 0)
{
    Console.WriteLine("空文字です。");
}
C#

しかし、valueがnullになる可能性がある場合、このコードには問題があります。

nullにはLengthというプロパティが存在しないためです。

その結果、実行時にNullReferenceExceptionが発生する可能性があります。

そのため、単純に「nullまたは空文字」を判定したいのであれば、次のコードを使用するほうが安全で意図も明確です。

string? value = GetValue();

// nullまたは空文字列を安全にチェックする
if (string.IsNullOrEmpty(value))
{
    Console.WriteLine("値がありません。");
}
C#

「nullチェック」と「空文字チェック」を別々に書く方法

string.IsNullOrEmpty()を使わず、あえて別々に判定することもできます。

string? value = GetValue();

// nullかチェックする
if (value == null)
{
    Console.WriteLine("値そのものがありません。");
    return;
}

// 空文字列かチェックする
if (value == "")
{
    Console.WriteLine("空文字列です。");
    return;
}

// nullでも空文字列でもない
Console.WriteLine($"値:{value}");
C#

この書き方には、nullと空文字列を区別して処理できるというメリットがあります。

たとえば、業務上「nullならデータ未登録」「空文字ならユーザーが意図的に空にした」というように、意味が異なる場合には、あえて分けて処理することがあります。

ただし、単純に「どちらも値なし」として扱うのであれば、次のようにまとめることができます。

string? value = GetValue();

// nullまたは空文字列なら同じ処理をする
if (string.IsNullOrEmpty(value))
{
    Console.WriteLine("値がありません。");
    return;
}
C#

実務例:検索キーワードの入力チェック

業務システムでは、検索画面のキーワードチェックがよく登場します。

Console.Write("検索キーワード:");

// ユーザーが入力した検索キーワードを取得する
string? keyword = Console.ReadLine();

// nullまたは空文字列の場合は検索しない
if (string.IsNullOrEmpty(keyword))
{
    Console.WriteLine("検索キーワードを入力してください。");
    return;
}

// キーワードが入力されている場合は検索処理を実行する
Console.WriteLine($"「{keyword}」を検索します。");
C#

ただし、「スペースだけの入力も検索しない」という仕様なら、次のようにします。

Console.Write("検索キーワード:");

// 検索キーワードを取得する
string? keyword = Console.ReadLine();

// null、空文字列、空白だけの場合は検索しない
if (string.IsNullOrWhiteSpace(keyword))
{
    Console.WriteLine("検索キーワードを入力してください。");
    return;
}

// 検索処理を実行する
Console.WriteLine($"「{keyword}」を検索します。");
C#

実務例:設定値をチェックする

設定ファイルなどから値を取得するときも、文字列が存在するかを確認することがあります。

// 設定ファイルから接続先を取得するイメージ
string? connectionString = GetConnectionString();

// 接続文字列が設定されていない場合
if (string.IsNullOrEmpty(connectionString))
{
    Console.WriteLine("接続文字列が設定されていません。");
    return;
}

// 接続文字列を使用して処理を続ける
Console.WriteLine("データベースへ接続します。");
C#

ここで注意したいのは、「空でないこと」と「正しい値であること」は別だということです。

たとえば、次の文字列は空ではありません。

string connectionString = "abc";
C#

しかし、これが実際に有効な接続文字列かどうかは、IsNullOrEmpty()では判断できません。

つまり、入力値の検証は段階的に考える必要があります。

  1. 値が存在するか
  2. 長さが適切か
  3. 形式が正しいか
  4. 実際に利用可能な値か

実務例:必須項目をチェックする

複数の入力項目を持つ画面では、必須項目のチェックにも使用できます。

// ユーザー名を取得する
string? userName = GetUserName();

// メールアドレスを取得する
string? email = GetEmail();

// ユーザー名が未入力かチェックする
if (string.IsNullOrEmpty(userName))
{
    Console.WriteLine("ユーザー名を入力してください。");
    return;
}

// メールアドレスが未入力かチェックする
if (string.IsNullOrEmpty(email))
{
    Console.WriteLine("メールアドレスを入力してください。");
    return;
}

// 必須項目が入力されている場合の処理
Console.WriteLine("入力チェックを通過しました。");
C#

ユーザー入力で空白だけの値も未入力にしたい場合は、次のようにします。

// ユーザー名を取得する
string? userName = GetUserName();

// ユーザー名が未入力かチェックする
if (string.IsNullOrWhiteSpace(userName))
{
    Console.WriteLine("ユーザー名を入力してください。");
    return;
}
C#

TrimとIsNullOrEmptyは役割が違う

文字列の入力チェックでは、Trim()もよく登場します。

Trim()は、文字列の前後にある空白を取り除くためのメソッドです。

string value = "  C#  ";

// 前後の空白を取り除く
string trimmedValue = value.Trim();

Console.WriteLine(trimmedValue); // C#
C#

ただし、Trim()とIsNullOrEmpty()は役割が違います。

  • IsNullOrEmpty() → nullまたは空文字か判定する
  • IsNullOrWhiteSpace() → null、空文字、空白だけか判定する
  • Trim() → 前後の空白を取り除く

したがって、「空白だけかどうか確認したい」という目的であれば、わざわざTrim()を使って判定する必要はありません。

string? value = GetValue();

// 空白だけかどうかを判定する
if (string.IsNullOrWhiteSpace(value))
{
    Console.WriteLine("未入力です。");
}
C#

空チェックと入力値の正当性は別問題

セキュリティや品質の観点でも、ここは非常に重要です。

string.IsNullOrEmpty()でチェックしたからといって、その文字列が「正しい値」であることが保証されるわけではありません。

たとえば、メールアドレスを入力してもらうケースを考えます。

string? email = GetEmail();

// nullまたは空文字列ではないことを確認する
if (string.IsNullOrEmpty(email))
{
    Console.WriteLine("メールアドレスを入力してください。");
    return;
}

// ここでは「何か文字列が入力された」ことしか分かりません。
// メールアドレスとして正しい形式かどうかは別途確認が必要です。
C#

"abc"という文字列は空ではありません。

したがって、空チェックは通過します。

しかし、システムの仕様によってはメールアドレスとして不正です。

このように、入力値の検証では「存在チェック」と「形式チェック」を分けて考えることが大切です。

SQLやHTMLに渡す場合は別途セキュリティ対策が必要

ユーザーから入力された文字列をデータベースやHTMLなどで使用する場合、空チェックだけではセキュリティ対策として不十分です。

たとえば、次のようなコードがあったとします。

string? keyword = Console.ReadLine();

// 入力されているか確認する
if (string.IsNullOrWhiteSpace(keyword))
{
    Console.WriteLine("キーワードを入力してください。");
    return;
}

// ここから先でkeywordを利用する
Search(keyword);
C#

ここで確認できているのは、「キーワードが空ではない」ということだけです。

データベースへ値を渡す場合は、SQL文字列へ直接連結するのではなく、パラメータ化クエリなど、利用する技術に応じた適切な対策が必要です。

// 空チェックは「値が存在するか」を確認する処理です。
// SQLインジェクション対策そのものではありません。
if (string.IsNullOrWhiteSpace(keyword))
{
    return;
}

// 実際のデータベース処理では、
// SQLパラメータなどを利用して安全に値を渡します。
C#

つまり、「空ではない」ことと「安全に使用できる」ことは別問題です。

null許容参照型とstring?を理解する

最近のC#では、nullになる可能性がある文字列をstring?と書くことがあります。

// nullになる可能性がある文字列
string? value = null;

// nullにはならないことを前提とする文字列
string text = "C#";
C#

?は、「この参照型はnullになる可能性があります」という意図をコンパイラに伝えるために使われます。

たとえば、ユーザー入力を取得する処理では、次のように書けます。

// ユーザー入力はnullになる可能性がある
string? input = Console.ReadLine();

// nullまたは空文字列かチェックする
if (string.IsNullOrEmpty(input))
{
    Console.WriteLine("入力されていません。");
    return;
}

// ここから先では入力値を利用する
Console.WriteLine($"入力値:{input}");
C#

このように、string?とIsNullOrEmpty()は相性がよく、null安全なコードを書くうえで役立ちます。

実務で使える共通メソッドのテンプレート

プロジェクトによっては、独自のユーティリティクラスを作って文字列関連の処理をまとめることがあります。

たとえば、次のようなクラスです。

public static class StringUtility
{
    /// <summary>
    /// nullまたは空文字列か判定します。
    /// </summary>
    /// <param name="value">判定対象の文字列</param>
    /// <returns>nullまたは空文字列の場合はtrue</returns>
    public static bool IsNullOrEmpty(string? value)
    {
        // C#標準のIsNullOrEmptyを利用する
        return string.IsNullOrEmpty(value);
    }
}
C#

使用すると次のようになります。

// 判定対象の文字列
string? value = GetValue();

// 独自ユーティリティを使用してチェックする
if (StringUtility.IsNullOrEmpty(value))
{
    Console.WriteLine("値がありません。");
    return;
}

// 値が存在する場合の処理
Console.WriteLine($"値:{value}");
C#

ただし、単純にstring.IsNullOrEmpty()を呼び出すだけのラッパーメソッドを作る必要があるかどうかは、プロジェクトの設計方針によって判断してください。

標準メソッドを直接使用したほうが、余計な抽象化がなく、C#を知っている開発者には分かりやすい場合もあります。

よくある間違いと注意点

間違い1:Lengthでいきなり判定する

string? value = GetValue();

// valueがnullの場合に問題が発生する可能性があります
if (value.Length == 0)
{
    Console.WriteLine("空です。");
}
C#

代わりに次のようにします。

// nullまたは空文字列を安全に判定する
if (string.IsNullOrEmpty(value))
{
    Console.WriteLine("空です。");
}
C#

間違い2:IsNullOrEmptyで空白まで判定できると思う

string value = "   ";

// 空白文字があるためfalseになります
if (string.IsNullOrEmpty(value))
{
    Console.WriteLine("空です。");
}
C#

空白だけの場合も未入力として扱いたいなら、次を使用します。

// null、空文字列、空白だけを判定する
if (string.IsNullOrWhiteSpace(value))
{
    Console.WriteLine("未入力です。");
}
C#

間違い3:空チェックだけで入力値を信用する

string? value = GetValue();

// 空ではないことだけを確認しています
if (!string.IsNullOrEmpty(value))
{
    // 「正しい値」であることまでは保証されません
}
C#

必要に応じて、文字数、形式、許可される文字、業務上の制約などを追加でチェックします。

最終的に覚えておきたい基本パターン

まず、「nullまたは空文字か判定する」なら、次のコードを覚えておきましょう。

// 判定対象の文字列
string? value = GetValue();

// nullまたは空文字列か確認する
if (string.IsNullOrEmpty(value))
{
    // 値が存在しない場合の処理
    Console.WriteLine("値を入力してください。");
    return;
}

// 値が存在する場合の処理
Console.WriteLine($"入力値:{value}");
C#

そして、「null、空文字、空白だけを未入力として扱う」なら、こちらです。

// 判定対象の文字列
string? value = GetValue();

// null、空文字列、空白だけの場合をチェックする
if (string.IsNullOrWhiteSpace(value))
{
    // 未入力の場合の処理
    Console.WriteLine("値を入力してください。");
    return;
}

// 入力済みの場合の処理
Console.WriteLine($"入力値:{value}");
C#

まとめ

C#で文字列の「nullまたは空文字」を判定する場合、基本となるのはstring.IsNullOrEmpty()です。

nullと空文字列をそれぞれ個別にチェックするよりも、標準メソッドを使うことでコードの意図を明確にできます。

特に覚えておきたいのは、次の使い分けです。

目的使用するメソッド
nullまたは空文字列か確認するstring.IsNullOrEmpty()
null、空文字列、空白だけか確認するstring.IsNullOrWhiteSpace()
空文字列を設定するstring.Empty
前後の空白を削除するTrim()
文字数を取得するLength

そして、最も重要なのは、「nullまたは空文字か」と「その文字列が正しいか」は別の問題だということです。

たとえば、必須入力のチェックではIsNullOrEmpty()やIsNullOrWhiteSpace()を使い、その後に文字数や形式などの検証を行います。

また、ユーザーから受け取った文字列をデータベースやHTMLなどで利用する場合には、空チェックだけで安全性が確保されるわけではありません。利用先に応じた入力検証やエスケープ、パラメータ化などを別途考える必要があります。

まずは、次の2つを確実に使い分けられるようになることが、C#の文字列処理を実務で扱うための第一歩です。

// nullまたは空文字列を判定
if (string.IsNullOrEmpty(value))
{
    // 値がない
}

// null、空文字列、空白だけを判定
if (string.IsNullOrWhiteSpace(value))
{
    // 実質的に未入力
}
C#
タイトルとURLをコピーしました