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

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

C#で文字列が空か判定する方法

C#で業務・実務向けのプログラムを作っていると、「入力された文字列が空なのか確認したい」という処理が頻繁に登場します。

たとえば、ユーザーが入力した名前、検索キーワード、メールアドレス、ファイルパス、設定値などを扱う場合、値が何も入力されていない状態を正しく判定する必要があります。

C#では、文字列が空かどうかを判定するために、主に次の方法を使います。

  • string.IsNullOrEmpty()
  • string.IsNullOrWhiteSpace()
  • string.Empty
  • == ""
  • string.Length

この中でも、業務・実務で特に重要なのがstring.IsNullOrEmpty()とstring.IsNullOrWhiteSpace()です。

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

文字列の判定を理解するためには、まずnullと空文字列の違いを理解することが重要です。

たとえば、次のコードを考えてみましょう。

// nullは「文字列そのものが存在しない」状態
string? name1 = null;

// 空文字列は「文字数が0の文字列」
string name2 = "";

// 文字が入っている文字列
string name3 = "田中";
C#

見た目としては、nullも""も「何も入っていない」ように感じます。

しかし、C#のプログラム上では別物です。

nullとは何か

nullは、簡単にいうと「値が存在しない」という状態を表します。

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

string? name = null;

// nameには文字列オブジェクトが存在しません。
C#

この状態で、次のようにLengthを使用すると問題が発生します。

string? name = null;

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

そのため、実務ではnullの可能性がある文字列を扱う場合、事前に確認することが重要です。

空文字列とは何か

一方、空文字列は「文字列は存在するが、中に文字が1文字も入っていない状態」です。

string name = "";

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

つまり、次の2つは似ていますが意味が違います。

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

value1は「文字列が存在しない」、value2は「空の文字列」です。

最も基本的な方法はstring.IsNullOrEmpty

文字列がnullまたは空文字列か判定したい場合は、string.IsNullOrEmpty()を使用します。

string? name = null;

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

string.IsNullOrEmpty()は、次の2つをまとめて判定できます。

  • null
  • ""(空文字列)

つまり、次のような条件を1つのメソッドで書けます。

if (name == null || name == "")
{
    // 空として扱う
}
C#

これを次のように簡潔に書けます。

if (string.IsNullOrEmpty(name))
{
    // nullまたは空文字列
}
C#

業務プログラムでは、この書き方を覚えておくと非常に便利です。

string.IsNullOrEmptyの基本テンプレート

実務では、次の形を基本テンプレートとして覚えておくとよいでしょう。

string? value = GetValue();

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

たとえば、ユーザーの名前を入力するプログラムなら次のようにできます。

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

// ユーザーから文字列を入力する
string? name = Console.ReadLine();

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

// ここまで来た場合は、何らかの文字列が入力されています。
Console.WriteLine($"こんにちは、{name}さん。");
C#

このように、入力チェックの最初にIsNullOrEmptyを使うことで、その後の処理を安全に進めやすくなります。

空文字列だけを判定する場合

「nullではなく、空文字列だけを判定したい」という場合もあります。

たとえば、次のような書き方があります。

string value = "";

// 空文字列か判定する
if (value == "")
{
    Console.WriteLine("空文字列です。");
}
C#

しかし、業務プログラムでは「空文字列だけ」を特別に判定したいケースを除けば、string.IsNullOrEmpty()を使うほうが意図が明確になります。

特に、外部から受け取った値はnullになる可能性があるためです。

string.Emptyとは何か

C#には空文字列を表すstring.Emptyもあります。

// 空文字列を表す
string value = string.Empty;
C#

これは次のコードと基本的に同じ意味です。

string value1 = "";
string value2 = string.Empty;
C#

どちらも「文字が0個の文字列」です。

ただし、string.Emptyは「空文字列を明示的に表している」という意図がコードから読み取りやすいという特徴があります。

たとえば、初期値として空文字列を設定する場合には次のように書けます。

// 名前の初期値として空文字列を設定する
string name = string.Empty;
C#

一方、「値が空か判定する」という目的では、次のように書くことができます。

string value = string.Empty;

// nullまたは空文字列か確認する
if (string.IsNullOrEmpty(value))
{
    Console.WriteLine("値が空です。");
}
C#

string.IsNullOrWhiteSpaceが重要

実務で特に注意したいのが、空文字列と「空白しか入っていない文字列」は違うという点です。

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

string value = "   ";
C#

この文字列にはスペースが入っています。

そのため、string.IsNullOrEmpty()ではtrueになりません。

string value = "   ";

// スペースが入っているためfalseになります。
if (string.IsNullOrEmpty(value))
{
    Console.WriteLine("空です。");
}
else
{
    Console.WriteLine("空ではありません。");
}
C#

しかし、ユーザー入力のチェックでは「スペースだけ入力された状態」も「未入力」として扱いたいことがあります。

その場合に使用するのがstring.IsNullOrWhiteSpace()です。

string value = "   ";

// null、空文字列、空白文字だけの文字列を判定できます。
if (string.IsNullOrWhiteSpace(value))
{
    Console.WriteLine("実質的に空です。");
}
C#

これは業務システムの入力チェックで非常に重要なメソッドです。

IsNullOrEmptyとIsNullOrWhiteSpaceの違い

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

値IsNullOrEmptyIsNullOrWhiteSpace
nulltruetrue
""truetrue
" "falsetrue
"abc"falsefalse
" abc "falsefalse

この違いを理解しておくことが非常に重要です。

ユーザー入力ならIsNullOrWhiteSpaceを検討する

たとえば、名前を入力してもらう画面があるとします。

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

string? name = Console.ReadLine();

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

// 入力された名前を表示する
Console.WriteLine($"こんにちは、{name}さん。");
C#

この場合、ユーザーが半角スペースだけを入力しても「入力済み」として処理されるのを防げます。

なぜLengthで判定しないほうがよいのか

初心者の方は、文字列の長さを取得するLengthを使って空文字列を判定したくなることがあります。

string? value = "";

// 文字数が0なら空と判定する
if (value.Length == 0)
{
    Console.WriteLine("空です。");
}
C#

しかし、このコードには問題があります。

valueがnullだった場合、Lengthを取得できません。

string? value = null;

// nullなのでLengthを使用できません。
// NullReferenceExceptionなどの原因になります。
if (value.Length == 0)
{
    Console.WriteLine("空です。");
}
C#

そのため、nullの可能性がある文字列を安全にチェックする目的なら、次の書き方が適しています。

string? value = null;

// nullまたは空文字列ならtrue
if (string.IsNullOrEmpty(value))
{
    Console.WriteLine("値が空です。");
}
C#

「空白だけの場合も空として扱う」という要件なら、さらにIsNullOrWhiteSpaceを使います。

string? value = null;

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

入力チェックで使える実務的な例

ここからは、実際の業務プログラムで登場しやすいケースを見ていきます。

検索キーワードをチェックする

検索画面では、検索キーワードが入力されているか確認することがあります。

Console.Write("検索キーワードを入力してください:");

string? keyword = Console.ReadLine();

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

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

このような入力チェックは、Webアプリケーション、デスクトップアプリケーション、バッチ処理などでも頻繁に登場します。

ファイルパスをチェックする

ファイルパスを設定ファイルなどから取得する場合も、空文字列チェックが必要になることがあります。

string? filePath = GetFilePath();

// ファイルパスが未設定か確認する
if (string.IsNullOrWhiteSpace(filePath))
{
    Console.WriteLine("ファイルパスが設定されていません。");
    return;
}

// ファイルパスが存在することを前提に処理する
Console.WriteLine($"ファイルパス:{filePath}");
C#

ただし、ここで重要なのは「文字列が空でないこと」と「実際に存在するファイルであること」は別問題だということです。

たとえば、次のチェックだけでは不十分です。

if (!string.IsNullOrWhiteSpace(filePath))
{
    // ここでは「文字列が入っている」ことしか保証されていません。
    // ファイルが存在するとは限りません。
}
C#

実際のファイルを扱う場合は、さらにファイルの存在確認などを行う必要があります。

メールアドレスの入力チェック

メールアドレスの場合も、最初に「入力されているか」を確認できます。

string? email = GetEmail();

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

// ここでは「何らかの文字列が入力された」ことを確認できた状態です。
// メールアドレスとして正しい形式かどうかは別途チェックします。
Console.WriteLine($"入力されたメールアドレス:{email}");
C#

ここで重要なのは、IsNullOrWhiteSpace()はメールアドレスの形式まで検証するメソッドではないということです。

たとえば、abcという文字列は空ではありません。

したがって、次の判定は通過します。

string email = "abc";

// 空ではないのでfalseになります。
bool isEmpty = string.IsNullOrWhiteSpace(email);
C#

しかし、これは「メールアドレスとして正しい」とは限りません。

つまり、入力値の検証では、次のように役割を分けて考えることが重要です。

  1. 入力されているか確認する
  2. 文字数などの制約を確認する
  3. 形式が正しいか確認する
  4. 必要に応じてデータベースなどの外部情報と照合する

実務でおすすめの入力チェックパターン

入力値を受け取ったら、最初に空チェックを行うという設計は非常に分かりやすいです。

public static void ProcessUserName(string? name)
{
    // ----------------------------------------
    // 1. 未入力チェック
    // ----------------------------------------
    if (string.IsNullOrWhiteSpace(name))
    {
        Console.WriteLine("名前を入力してください。");
        return;
    }

    // ----------------------------------------
    // 2. 文字数チェック
    // ----------------------------------------
    if (name.Length > 100)
    {
        Console.WriteLine("名前は100文字以内で入力してください。");
        return;
    }

    // ----------------------------------------
    // 3. 正常な入力として処理
    // ----------------------------------------
    Console.WriteLine($"名前:{name}");
}
C#

このように、「不正な状態を先に排除する」書き方は、業務プログラムを読みやすくするうえでも役立ちます。

文字列をTrimしてから判定する方法との違い

以前からC#では、Trim()を使って空白を除去してから判定する方法もあります。

string? value = "   ";

// 前後の空白を削除してから空文字列か確認する
if (value == null || value.Trim() == "")
{
    Console.WriteLine("空です。");
}
C#

しかし、単純に「null、空文字列、空白文字だけか」を確認したいのであれば、現在のC#ではstring.IsNullOrWhiteSpace()を使うほうがコードの意図が明確です。

string? value = "   ";

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

特に重要なのは、Trim()そのものを「入力チェックのためだけ」に使う必要はないということです。

もちろん、入力値の前後の空白を実際に削除したいという要件があるなら、Trim()などを使用します。

string? name = Console.ReadLine();

// nullでなければ前後の空白を削除する
string? normalizedName = name?.Trim();
C#

「空白かどうかを判定する」と「空白を削除する」は別の処理として考えると理解しやすくなります。

空チェックと文字列加工を混同しない

業務プログラムでは、入力値をそのまま使うのか、前後の空白を除去してから使うのかを明確にする必要があります。

たとえば、次の入力があったとします。

"  山田太郎  "

これに対して、単純に空チェックするだけなら次のようになります。

string? name = "  山田太郎  ";

// 空白だけではないためfalseになります。
if (string.IsNullOrWhiteSpace(name))
{
    Console.WriteLine("未入力です。");
}
C#

一方、前後の空白を削除して保存したい場合は、別途Trim()を使います。

string? name = "  山田太郎  ";

// 前後の空白を削除する
string? normalizedName = name?.Trim();

// 空白除去後の値を表示する
Console.WriteLine(normalizedName); // 山田太郎
C#

このように、

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

という役割の違いを覚えておくと、コードを書きやすくなります。

メソッド化するとさらに実務で使いやすい

同じような入力チェックがプログラムのあちこちに登場する場合は、共通メソッドにまとめる方法もあります。

public static bool IsBlank(string? value)
{
    // null、空文字列、空白だけの場合はtrueを返す
    return string.IsNullOrWhiteSpace(value);
}
C#

このメソッドを使うと、次のように書けます。

string? name = Console.ReadLine();

// 自作のIsBlankメソッドで未入力を確認する
if (IsBlank(name))
{
    Console.WriteLine("名前を入力してください。");
    return;
}

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

ただし、単純な処理をわざわざ独自メソッドにする必要があるかは、プロジェクトの規模やコーディング規約によって判断してください。

string.IsNullOrWhiteSpace()という標準メソッドの名前を直接使ったほうが、C#を知っている開発者には意図が伝わりやすい場合もあります。

業務システムでは「未入力」の定義を決める

文字列の空チェックで最も重要なのは、単なる文法ではありません。

業務上、「何を未入力とみなすのか」を決めることです。

たとえば、次の値があります。

null
""
" "
"    "
"山田"
" 山田 "

これらをすべて同じ「未入力」として扱うのか、それとも区別するのかは、システムの仕様によって変わります。

たとえば、一般的なユーザー入力フォームなら、次のような仕様が考えられます。

// null、空文字列、空白だけを未入力として扱う
if (string.IsNullOrWhiteSpace(value))
{
    // 必須入力エラー
}
C#

一方、空白そのものが意味を持つデータを扱うシステムでは、単純にIsNullOrWhiteSpace()を使用すると仕様と合わない可能性があります。

したがって、「空文字列だから必ず悪い」と考えるのではなく、「この項目では何を未入力と定義するのか」を確認することが重要です。

セキュリティ面でも入力チェックは重要

空文字列のチェック自体が直接的なセキュリティ対策になるわけではありませんが、入力値の検証は安全なシステムを作るうえで重要な工程です。

特に、ユーザーから受け取った文字列を、そのままデータベース、HTML、OSのコマンド、ファイル操作などへ渡す場合には注意が必要です。

たとえば、次のような処理があったとします。

string? keyword = Console.ReadLine();

// 未入力チェック
if (string.IsNullOrWhiteSpace(keyword))
{
    Console.WriteLine("検索キーワードを入力してください。");
    return;
}

// ここから先は入力値を使った処理
Search(keyword);
C#

ここで重要なのは、空チェックを通過したからといって、その文字列が安全だとは限らないことです。

空チェックはあくまで「値が存在するか」を確認する処理です。

たとえばSQLを扱う場合は、文字列をSQL文に直接連結するのではなく、パラメータ化クエリを使用するなど、用途に応じた適切な対策が必要です。

// 空チェックは入力値の有無を確認するための処理です。
// SQLインジェクション対策そのものではありません。
if (string.IsNullOrWhiteSpace(keyword))
{
    return;
}

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

「入力値が空ではない」ことと、「入力値を安全に利用できる」ことは別問題です。

よくある間違い

間違い1:Lengthをいきなり使う

string? value = null;

// nullの場合に問題になる
if (value.Length == 0)
{
    // ...
}
C#

このようなコードは、nullの可能性がある場合には避けましょう。

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

if (string.IsNullOrEmpty(value))
{
    // nullまたは空文字列
}
C#

間違い2:IsNullOrEmptyだけで空白を判定する

string value = "   ";

// 空白が入っているためfalseになります。
if (string.IsNullOrEmpty(value))
{
    Console.WriteLine("未入力");
}
C#

「スペースだけの入力も未入力とする」という仕様なら、こちらを使います。

// 空白だけの文字列も未入力として扱う
if (string.IsNullOrWhiteSpace(value))
{
    Console.WriteLine("未入力");
}
C#

間違い3:空チェックだけで入力値の正当性を保証する

次のコードでは、「値が入力されている」ことしか確認できません。

if (!string.IsNullOrWhiteSpace(email))
{
    // emailが空ではないことしか保証されません。
}
C#

メールアドレスとして正しいか、文字数制限を満たしているか、使用可能な文字だけで構成されているかなどは、別途検証する必要があります。

実務で使える基本テンプレート

まず覚えておきたいテンプレートは次のコードです。

// 入力値を取得する
string? value = GetValue();

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

// ここから先は入力済みとして処理する
Console.WriteLine($"入力値:{value}");
C#

「nullと空文字列だけ」を判定したい場合はこちらです。

// 入力値を取得する
string? value = GetValue();

// nullまたは空文字列の場合をチェックする
if (string.IsNullOrEmpty(value))
{
    // 値がない場合の処理
    Console.WriteLine("値がありません。");
    return;
}

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

最終的に覚えておきたい使い分け

C#で文字列が空か判定する場合は、まず「何を空と定義するのか」を考えることが重要です。

目的使用するもの
空文字列を表したいstring.Empty
nullまたは空文字列を判定したいstring.IsNullOrEmpty()
null、空文字列、空白だけを判定したいstring.IsNullOrWhiteSpace()
前後の空白を削除したいTrim()
文字数を取得したいLength

特に、ユーザー入力やフォームの必須項目をチェックする場合は、次のコードを基本形として覚えておくとよいでしょう。

// ユーザーから入力された文字列
string? value = Console.ReadLine();

// null、空文字列、空白だけの場合を未入力として扱う
if (string.IsNullOrWhiteSpace(value))
{
    Console.WriteLine("入力してください。");
    return;
}

// ここから先は「何らかの文字列が入力された」状態
Console.WriteLine($"入力値:{value}");
C#

そして、最も大切なのは、IsNullOrEmpty()とIsNullOrWhiteSpace()の違いです。

IsNullOrEmpty()は「nullまたは文字数0」を判定します。

IsNullOrWhiteSpace()は、それに加えて「空白文字だけの文字列」も未入力として判定します。

実務では、ユーザー入力や必須項目のチェックならIsNullOrWhiteSpace()、空文字列とnullだけを区別したい処理ならIsNullOrEmpty()という使い分けを基本にすると、コードの意図が分かりやすくなります。

なお、空チェックを通過した文字列が「正しい値」「安全な値」であることまで保証されるわけではありません。文字数、形式、許可文字、データベース上の存在確認などは、必要に応じて別のバリデーションとして実装することが重要です。

タイトルとURLをコピーしました