C# Tips | 文字列操作:文字列を安全にTrimする

Web APP C#
スポンサーリンク
スポンサーリンク
  1. C#で文字列を安全にTrimする方法
  2. そもそもTrimとは何か
    1. 基本的なTrimの使い方
    2. Trimは文字列の途中にある空白を削除しません
  3. Trimには種類がある
    1. TrimStart()
    2. TrimEnd()
  4. Trimで最も注意したい「null」
    1. if文でnullを確認する
  5. 「?.Trim()」を使って安全にTrimする
    1. 実務でよく使うテンプレート
  6. Trimした結果を必ず文字列にしたい場合
    1. 「?.」と「??」を組み合わせる
  7. Trimと空文字は別物
    1. null
    2. 空文字
    3. 空白だけの文字列
  8. Trimすると「空白だけの文字列」はどうなるのか
  9. TrimとIsNullOrWhiteSpaceを組み合わせる
    1. Trimしてから判定する場合との違い
  10. 実務テンプレート1:ユーザー入力を安全にTrimする
  11. 実務テンプレート2:検索キーワードをTrimする
  12. Trimは元の文字列を書き換えるのか
  13. Trimするときに注意したい空白文字
  14. Trimで文字列の途中まで変更してはいけないケース
  15. データベースへ保存する前にTrimするべきか
  16. Trimとデータベース検索で注意すること
  17. Trimとセキュリティ
    1. SQLでは文字列連結を避ける
  18. 業務で使える「安全なTrim」ユーティリティ
    1. nullなら空文字、それ以外はTrimする
    2. ただしユーティリティを作りすぎない
  19. 「Trimしてから判定」と「判定してからTrim」の違い
  20. 実務テンプレート:入力値を正規化して検証する
  21. よくある間違い1:nullのままTrimする
  22. よくある間違い2:Trimしただけで元の変数が変わると思う
  23. よくある間違い3:Trimすれば入力チェックも完了すると考える
  24. よくある間違い4:文字列の途中の空白まで削除しようとする
  25. よくある間違い5:すべての文字列を自動的にTrimする
  26. 文字列を安全にTrimするためのおすすめテンプレート
  27. さらに実務的なユーティリティを作る
  28. 「安全にTrimする」の本当の意味
  29. C#の安全なTrim処理チートシート
  30. まとめ

C#で文字列を安全にTrimする方法

C#で業務システムを開発していると、「文字列の前後に余計な空白が入っている」「ユーザーが入力した値に改行が含まれている」「そもそも文字列がnullかもしれない」といった問題に遭遇することがあります。

このような場合によく利用するのが、文字列の前後にある空白を取り除くTrimです。

たとえば、次のような文字列があるとします。

// 前後に半角スペースが入っている文字列
string name = "  山田太郎  ";
C#

この文字列にTrimを実行すると、前後の空白を取り除いて次のようにできます。

string name = "  山田太郎  ";

// 文字列の前後にある空白を取り除く
string trimmedName = name.Trim();

// 結果:「山田太郎」
Console.WriteLine(trimmedName);
C#

一見すると非常に簡単な処理ですが、業務・実務で使う場合には、nullの扱い、空文字の扱い、空白文字の種類、Trim後の値をどのように扱うかなど、いくつか注意すべきポイントがあります。

この記事では、C#初心者の方でも理解できるように、単純なTrimの使い方から、nullを安全に処理する方法、入力値の正規化、業務システムで使えるテンプレート、セキュリティ上の注意点まで順番に解説します。

そもそもTrimとは何か

まずはTrimが何をするメソッドなのかを理解しましょう。

C#のTrim()は、文字列の先頭と末尾にある空白文字を取り除いた新しい文字列を返します。

基本的なTrimの使い方

基本形は次のとおりです。

string result = text.Trim();
C#

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

string text = "  Hello World  ";

// 先頭と末尾の空白を削除する
string result = text.Trim();

Console.WriteLine(result);
C#

実行結果は次のようになります。

Hello World

元の文字列は次のようになっています。

"  Hello World  "

Trim後は次のようになります。

"Hello World"

つまり、Trimは文字列の外側にある不要な空白を取り除くために使用します。

Trimは文字列の途中にある空白を削除しません

ここは初心者の方が特に間違えやすいポイントです。

Trimは文字列の先頭と末尾を処理します。文字列の途中にある空白は削除しません。

string text = "  Hello   World  ";

// 前後の空白だけを削除する
string result = text.Trim();

Console.WriteLine(result);
C#

結果は次のようになります。

Hello   World

中央部分の3つの空白はそのまま残っています。

つまり、Trimは次のような処理です。

"  Hello   World  "
^^                ^^
前後の空白を削除

一方で、文字列の途中にある空白まで削除したい場合は、Trimではなく別の処理が必要です。

Trimには種類がある

C#では、用途に応じていくつかのTrim系メソッドを使い分けることができます。

メソッド処理内容用途
Trim()前後の空白を削除入力値の前後を整える
TrimStart()先頭の空白を削除先頭だけを整える
TrimEnd()末尾の空白を削除末尾だけを整える

TrimStart()

TrimStart()は、文字列の先頭にある空白を取り除きます。

string text = "  Hello World  ";

// 先頭の空白だけを削除する
string result = text.TrimStart();

Console.WriteLine(result);
C#

結果は次のようになります。

Hello World  

末尾の空白は残っています。

TrimEnd()

TrimEnd()は、文字列の末尾にある空白を取り除きます。

string text = "  Hello World  ";

// 末尾の空白だけを削除する
string result = text.TrimEnd();

Console.WriteLine(result);
C#

結果は次のようになります。

  Hello World

このように、先頭だけ、末尾だけを整えたい場合にはTrimStart()やTrimEnd()を利用します。

Trimで最も注意したい「null」

業務システムでTrimを利用するときに、最も重要なポイントの一つがnullです。

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

string? name = null;

// nullの可能性がある文字列に対してTrimする
string result = name.Trim();
C#

このようなコードでは、nameがnullの場合にTrimを実行できません。

実行時にはNullReferenceExceptionが発生する可能性があります。

初心者の方が覚えておきたいのは、次の関係です。

null
↓
文字列そのものが存在しない
↓
その文字列のTrim()を呼び出すことができない

つまり、Trimを使う前に「この文字列はnullではないか?」を考える必要があります。

if文でnullを確認する

最も分かりやすい方法は、if文で確認することです。

string? name = GetName();

if (name != null)
{
    // nullではない場合だけTrimする
    name = name.Trim();
}
C#

この方法は非常に分かりやすい反面、業務コードが増えてくると、あちこちに同じnullチェックを書くことになります。

そこで、C#ではnull条件演算子を使う方法があります。

「?.Trim()」を使って安全にTrimする

nullの可能性がある文字列を安全にTrimしたい場合、非常に便利なのが?.です。

string? name = GetName();

// nameがnullでなければTrim()を実行する
// nameがnullなら結果もnullになる
string? trimmedName = name?.Trim();
C#

このコードでは、nameがnullの場合でもTrim()を呼び出そうとして例外になることを避けられます。

考え方としては次のようになります。

nameがnullではない
    ↓
Trim()を実行

nameがnull
    ↓
Trim()を実行しない
    ↓
結果はnull

業務コードでは、この書き方が非常に役立ちます。

実務でよく使うテンプレート

string? input = GetInput();

// nullの場合はnullのまま、それ以外は前後の空白を削除
string? normalized = input?.Trim();
C#

この方法なら、nullの可能性がある入力値を安全にTrimできます。

Trimした結果を必ず文字列にしたい場合

ここで少し考え方を変える必要があります。

「nullならnullのままでいい」のではなく、nullの場合は空文字にしたいという業務要件もあります。

その場合は、null合体演算子??を使うことができます。

string? input = GetInput();

// nullの場合は空文字にする
string result = input?.Trim() ?? "";
C#

このコードの意味は次のとおりです。

inputがnullではない
    ↓
Trim()する
    ↓
その結果をresultに入れる

inputがnull
    ↓
Trim()しない
    ↓
""をresultに入れる
C#

つまり、最終的にresultは必ず文字列になります。

「?.」と「??」を組み合わせる

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

string result = input?.Trim() ?? "";
C#

これは、次のような処理を1行で書いたものです。

string result;

if (input == null)
{
    // nullなら空文字にする
    result = "";
}
else
{
    // nullでなければ前後の空白を削除する
    result = input.Trim();
}
C#

もちろん、初心者の方が処理の流れを理解する段階ではif文で書いても問題ありません。

重要なのは、短く書くことではなく、「nullだった場合にどうするのか」という仕様を明確にすることです。

Trimと空文字は別物

ここで、Trimを理解するために非常に重要な考え方を整理します。

次の3つは似ていますが、同じものではありません。

null
""
"   "

null

nullは「文字列が存在しない」状態です。

string? value = null;
C#

空文字

空文字は、文字列そのものは存在しますが、文字が1文字も入っていない状態です。

string value = "";
C#

空白だけの文字列

空白だけの文字列は、文字列は存在していますが、スペースなどの空白文字しか入っていない状態です。

string value = "   ";
C#

これらを区別することは、業務システムでは重要です。

Trimすると「空白だけの文字列」はどうなるのか

次のコードを見てみましょう。

string value = "   ";

// 前後の空白を削除する
string result = value.Trim();

Console.WriteLine(result.Length);
C#

Trimすると、空白がすべて取り除かれるため、結果は空文字になります。

""

つまり、次のような変化が起こります。

"   "
  ↓ Trim()
""

この性質を利用すると、ユーザー入力の「実質的な未入力」を扱いやすくなります。

TrimとIsNullOrWhiteSpaceを組み合わせる

入力チェックでは、Trimとstring.IsNullOrWhiteSpace()を組み合わせることがあります。

IsNullOrWhiteSpace()は、値がnull、空文字、または空白文字だけの場合にtrueを返します。

string? input = GetInput();

if (string.IsNullOrWhiteSpace(input))
{
    // null、空文字、空白だけの場合
    Console.WriteLine("入力されていません。");
}
else
{
    // 有効な文字が含まれている場合
    Console.WriteLine("入力されています。");
}
C#

入力値が「何か文字を入力しているか」を確認するだけなら、わざわざTrimしてから判定する必要はありません。

たとえば、次のようなコードです。

if (string.IsNullOrWhiteSpace(input))
{
    // 未入力として扱う
}
C#

これは業務システムの入力チェックで非常によく使われる形です。

Trimしてから判定する場合との違い

次の2つは似ていますが、目的が少し違います。

// 入力されているかどうかを判定する
if (string.IsNullOrWhiteSpace(input))
{
    // 未入力
}
C#

一方、こちらは実際に値を整形しています。

// 値を保存・検索などに利用する前に前後の空白を削除
string normalized = input?.Trim() ?? "";
C#

つまり、

  • 判定したい → IsNullOrWhiteSpace()
  • 値を整えたい → Trim()
  • nullなら別の値にしたい → ??
  • nullなら処理自体をスキップしたい → ?.

というように役割を分けて考えると分かりやすくなります。

実務テンプレート1:ユーザー入力を安全にTrimする

Webフォームや業務アプリケーションでは、ユーザーが入力した値を受け取る場面が頻繁にあります。

たとえば名前を受け取る場合です。

string? name = GetName();

// nullなら空文字、それ以外なら前後の空白を削除する
string normalizedName = name?.Trim() ?? "";

// 未入力の場合はエラーにする
if (string.IsNullOrWhiteSpace(normalizedName))
{
    Console.WriteLine("名前を入力してください。");
    return;
}

// 整形済みの値を利用する
Console.WriteLine($"名前:{normalizedName}");
C#

このパターンは、入力値を受け取ってからチェックする業務処理で利用できます。

実務テンプレート2:検索キーワードをTrimする

検索画面では、ユーザーが次のように入力することがあります。

"  C# 入門  "

このまま検索処理に渡すのではなく、前後の空白を削除しておくと扱いやすくなります。

string? keyword = GetSearchKeyword();

// 検索キーワードの前後の空白を削除する
keyword = keyword?.Trim();

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

// ここから検索処理を実行する
Search(keyword);
C#

ここで重要なのは、Trimした値をその後の処理で利用することです。

次のように書いてしまうと、Trimした結果を捨てています。

string keyword = "  C#  ";

// Trimした結果をどこにも代入していない
keyword.Trim();

// keywordは「  C#  」のまま
Console.WriteLine(keyword);
C#

これは初心者の方が非常に間違えやすいポイントです。

Trimは元の文字列を書き換えるのか

C#のstringは不変(immutable)な型です。

そのため、Trim()を実行しても元の文字列そのものが変更されるわけではありません。

string text = "  Hello  ";

// Trim()の結果を別の変数に代入する
string result = text.Trim();

Console.WriteLine(text);
Console.WriteLine(result);
C#

結果は概念的に次のようになります。

text   → "  Hello  "
result → "Hello"

そのため、Trimした結果を使いたい場合は、戻り値を変数に代入する必要があります。

text = text.Trim();
C#

この書き方なら、変数textにTrim後の文字列を再代入できます。

Trimするときに注意したい空白文字

「空白」と聞くと、半角スペースだけを想像しがちですが、実際にはさまざまな空白文字があります。

たとえば、一般的なスペースだけではなく、タブや改行などもあります。

string text = "\tHello World\n";

// 前後の空白文字を取り除く
string result = text.Trim();
C#

入力データを扱う場合は、ユーザーが見た目では気づかない空白文字を入力している可能性があります。

そのため、単純に「半角スペースだけを削除する」と考えるのではなく、文字列の前後にある不要な空白文字を取り除くという目的でTrimを理解するとよいでしょう。

Trimで文字列の途中まで変更してはいけないケース

Trimは便利ですが、すべての文字列に対して無条件に実行すればよいわけではありません。

たとえば、文章データを扱う場合です。

string text = "これはサンプル文章です。  ";

// 前後の空白が意味を持つデータでは
// Trimによって意図しない変更になる可能性がある
string result = text.Trim();
C#

文章の前後の空白を不要とする仕様なら問題ありません。

しかし、空白そのものが意味を持つデータでは、勝手にTrimしてはいけません。

業務システムでは、「入力された値をそのまま保存するのか」「正規化して保存するのか」を仕様として決めておくことが重要です。

データベースへ保存する前にTrimするべきか

業務システムでは、Trimした値をデータベースへ保存するケースがあります。

たとえば顧客名を保存する場合です。

string? customerName = GetCustomerName();

// 保存する前に前後の空白を削除する
string normalizedName = customerName?.Trim() ?? "";

// データベースへ保存する
SaveCustomerName(normalizedName);
C#

この方法にはメリットがあります。

  • 前後の不要な空白がデータベースに入りにくくなる
  • 検索時の比較が安定しやすくなる
  • 同じ値なのに空白の違いだけで別データになる問題を減らせる

ただし、すべてのデータを機械的にTrimすればよいわけではありません。

「原文をそのまま保存する必要があるデータ」では、入力値と正規化後の値を別々に扱う設計も検討する必要があります。

Trimとデータベース検索で注意すること

検索条件をTrimすることは有効ですが、Trimしたからといってすべての検索問題が解決するわけではありません。

たとえば、次の2つは見た目が似ています。

"C#"
"C#"

しかし、文字としては異なる可能性があります。

Trimが行うのは主に前後の空白を取り除く処理です。

全角・半角の統一、文字種の統一、大文字・小文字の統一などは別の問題です。

したがって、次のような処理はそれぞれ目的を分けて考える必要があります。

// 前後の空白を削除
string value = input.Trim();

// 大文字・小文字の扱いを統一
// ※比較方法や要件に応じて設計する

// 全角・半角などの文字種を統一
// ※必要な場合は別途正規化処理を検討する
C#

Trimは文字列全体を完全に正規化する処理ではありません。

Trimとセキュリティ

Trim自体はセキュリティ対策ではありません。

ここは非常に重要です。

たとえば、次のようにTrimしたからといって、入力値が安全になるわけではありません。

string? input = GetInput();

// 前後の空白を削除しただけ
string normalized = input?.Trim() ?? "";
C#

Trimはあくまで文字列の整形処理です。

SQLインジェクション、XSS、コマンドインジェクションなどを防ぐためには、それぞれ適切な対策が必要です。

SQLでは文字列連結を避ける

データベース検索でTrimした値を利用する場合でも、SQL文字列を直接連結するのは避けます。

悪い例として、次のようなコードがあります。

// 注意:SQL文字列に入力値を直接連結する方法は避ける
string sql = "SELECT * FROM Users WHERE Name = '" + keyword + "'";
C#

データベースアクセスでは、使用しているライブラリやORMが提供するパラメータ化クエリなどの安全な仕組みを利用します。

つまり、次の2つは別問題として考えます。

  • Trim → 入力値を整形する
  • パラメータ化 → SQLインジェクションを防ぐための適切なデータベースアクセスを行う

Trimしたから安全なのではなく、Trimは入力値を扱いやすくするための処理だと理解しておきましょう。

業務で使える「安全なTrim」ユーティリティ

複数の場所で同じ処理を繰り返す場合は、専用のユーティリティメソッドを作る方法もあります。

nullなら空文字、それ以外はTrimする

たとえば、次のようなメソッドを作れます。

/// <summary>
/// nullなら空文字、それ以外なら前後の空白を削除して返します。
/// </summary>
public static string SafeTrim(string? value)
{
    // nullの場合は空文字を返す
    if (value == null)
    {
        return "";
    }

    // nullでなければ前後の空白を削除する
    return value.Trim();
}
C#

利用側は次のように書けます。

string? input = GetInput();

// nullを安全に処理しながらTrimする
string result = SafeTrim(input);

Console.WriteLine(result);
C#

このようなユーティリティを用意しておくと、同じ処理を複数箇所で使い回せます。

ただしユーティリティを作りすぎない

一方で、単純な処理まで何でもユーティリティ化する必要はありません。

たとえば、次のコードは非常に分かりやすいコードです。

string result = input?.Trim() ?? "";
C#

これをわざわざ独自メソッドにすると、プロジェクトによっては逆にコードを読みにくくすることがあります。

ユーティリティを作るべきかどうかは、次のような観点で判断するとよいでしょう。

  • 同じ処理を何度も書いているか
  • 独自の業務ルールが含まれているか
  • メソッド名によって意図が明確になるか
  • チーム内で共通化する価値があるか

「Trimしてから判定」と「判定してからTrim」の違い

入力チェックでは、処理する順番も重要です。

たとえば、「空白だけの入力を未入力として扱う」という要件なら、次のコードが分かりやすいです。

string? input = GetInput();

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

// 入力値を利用する
string value = input.Trim();

Console.WriteLine(value);
C#

または、最初にTrimして正規化してから判定することもできます。

string value = input?.Trim() ?? "";

// Trim後の値が空文字なら未入力と判断する
if (value.Length == 0)
{
    Console.WriteLine("入力してください。");
    return;
}
C#

ただし、単純な未入力判定ならIsNullOrWhiteSpace()のほうが意図が伝わりやすい場合があります。

重要なのは、コードを短くすることではなく、「何を未入力と定義しているのか」を明確にすることです。

実務テンプレート:入力値を正規化して検証する

業務システムでは、次のような流れを基本形として考えると整理しやすくなります。

入力値を受け取る
    ↓
nullを考慮する
    ↓
必要に応じてTrimする
    ↓
未入力かチェックする
    ↓
形式をチェックする
    ↓
業務処理へ渡す

コードにすると次のようになります。

string? input = GetInput();

// 1. nullを考慮しながら前後の空白を削除する
string value = input?.Trim() ?? "";

// 2. 未入力かどうかを確認する
if (value.Length == 0)
{
    Console.WriteLine("入力してください。");
    return;
}

// 3. 必要に応じて形式をチェックする
if (value.Length > 100)
{
    Console.WriteLine("100文字以内で入力してください。");
    return;
}

// 4. 検証済みの値を業務処理へ渡す
Process(value);
C#

このように、正規化 → 検証 → 業務処理という流れを意識すると、コードの責任範囲が分かりやすくなります。

よくある間違い1:nullのままTrimする

次のコードは注意が必要です。

string? value = GetValue();

// valueがnullの場合、例外になる可能性がある
string result = value.Trim();
C#

nullの可能性があるなら、次のようにします。

string result = value?.Trim() ?? "";
C#

または、if文で明示的にチェックします。

if (value != null)
{
    // nullではない場合だけTrimする
    value = value.Trim();
}
C#

よくある間違い2:Trimしただけで元の変数が変わると思う

次のコードでは、Trimの結果を使っていません。

string value = "  Hello  ";

// 戻り値を受け取っていない
value.Trim();

Console.WriteLine(value);
C#

正しくは、結果を代入します。

string value = "  Hello  ";

// Trim後の値を再代入する
value = value.Trim();

Console.WriteLine(value);
C#

よくある間違い3:Trimすれば入力チェックも完了すると考える

Trimはあくまで文字列の前後を整える処理です。

たとえば、次の値をTrimしても、メールアドレスとして正しいかどうかまでは判断できません。

string value = " [email protected] ";

value = value.Trim();
C#

Trim後は前後の空白がなくなりますが、その値が業務上正しいメールアドレスなのかは別途検証する必要があります。

同じように、Trimは次のような処理とは別物です。

  • 必須チェック
  • 文字数チェック
  • メールアドレス形式チェック
  • 数値形式チェック
  • SQLインジェクション対策
  • XSS対策
  • 認証・認可

Trimを「入力値を安全にする万能処理」と考えないことが重要です。

よくある間違い4:文字列の途中の空白まで削除しようとする

次の文字列を考えてみます。

string name = "山田 太郎";
C#

この文字列にTrimを実行しても、中央の空白は削除されません。

string result = name.Trim();

// 「山田 太郎」のまま
Console.WriteLine(result);
C#

これはTrimが正常に動作している結果です。

文字列の途中にある空白を削除する処理は、Trimとは別の目的になります。

よくある間違い5:すべての文字列を自動的にTrimする

業務アプリケーションでは、すべての文字列に対して機械的にTrimする設計が必ずしも正しいとは限りません。

たとえば、文章、メモ、コード、CSVのデータ、固定長データなどでは、空白に意味がある可能性があります。

そのため、次のように考えることが重要です。

この値は前後の空白を削除してよいか?
        ↓
はい → Trimする
いいえ → 元の値を保持する

「Trimするかどうか」は技術だけでなく、データの意味や業務要件によって決まります。

文字列を安全にTrimするためのおすすめテンプレート

実務では、まず次の形を覚えておくと便利です。

// nullなら空文字、それ以外ならTrimする
string value = input?.Trim() ?? "";
C#

入力チェックまで含める場合は、次の形が使いやすいでしょう。

// nullを考慮しながら前後の空白を削除する
string value = input?.Trim() ?? "";

// 空文字なら未入力として扱う
if (value.Length == 0)
{
    Console.WriteLine("入力してください。");
    return;
}

// ここから業務処理
Process(value);
C#

「空白だけの入力」も未入力として扱うなら、次の書き方も分かりやすいです。

string? input = GetInput();

// null、空文字、空白だけなら未入力
if (string.IsNullOrWhiteSpace(input))
{
    Console.WriteLine("入力してください。");
    return;
}

// 未入力ではないことを確認した後、前後の空白を削除する
string value = input.Trim();

// 業務処理へ渡す
Process(value);
C#

さらに実務的なユーティリティを作る

プロジェクト全体で「nullや空白をどう扱うか」というルールが決まっている場合は、専用のユーティリティクラスを作る方法があります。

public static class StringUtility
{
    /// <summary>
    /// nullなら空文字、それ以外なら前後の空白を削除します。
    /// </summary>
    public static string SafeTrim(string? value)
    {
        // nullの場合は空文字を返す
        return value?.Trim() ?? "";
    }

    /// <summary>
    /// null、空文字、空白だけの場合にtrueを返します。
    /// </summary>
    public static bool IsBlank(string? value)
    {
        // null、空文字、空白だけをまとめて判定する
        return string.IsNullOrWhiteSpace(value);
    }
}
C#

利用する側は次のようにできます。

string? input = GetInput();

// 入力値を安全にTrimする
string value = StringUtility.SafeTrim(input);

// 未入力か確認する
if (StringUtility.IsBlank(value))
{
    Console.WriteLine("入力してください。");
    return;
}

// 業務処理
Process(value);
C#

ただし、先ほど説明したとおり、単純な処理を過剰にユーティリティ化する必要はありません。

プロジェクト全体で同じルールを統一したい場合や、独自の業務ルールを追加する場合にユーティリティ化すると効果的です。

「安全にTrimする」の本当の意味

ここまでの内容を整理すると、「安全にTrimする」とは単純にTrim()を呼び出すことではありません。

重要なのは、次の点を順番に考えることです。

  1. この値はnullになる可能性があるか
  2. nullの場合、nullのままにするのか、空文字にするのか
  3. 前後の空白を削除してよいデータなのか
  4. 空白だけの入力を未入力として扱うのか
  5. Trimした後の値をどこで使うのか
  6. データベースなど外部システムへ渡す場合に別のセキュリティ対策が必要ではないか

この考え方を身につけると、単なるTrimの使い方だけでなく、業務システムにおける「入力値を安全かつ適切に扱う」という基本的な設計にもつながります。

C#の安全なTrim処理チートシート

やりたいことコード
前後の空白を削除value.Trim()
先頭の空白を削除value.TrimStart()
末尾の空白を削除value.TrimEnd()
nullならTrimしないvalue?.Trim()
nullなら空文字にするvalue?.Trim() ?? ""
null・空文字・空白を判定string.IsNullOrWhiteSpace(value)
null・空文字を判定string.IsNullOrEmpty(value)

まとめ

C#のTrim()は非常にシンプルなメソッドですが、業務システムでは入力値の扱いに関わる重要な処理として登場します。

基本的には、次のポイントを押さえておけばよいでしょう。

  • Trim()は文字列の前後にある空白を削除する
  • TrimStart()は先頭だけを削除する
  • TrimEnd()は末尾だけを削除する
  • Trim()は文字列の途中にある空白を削除しない
  • nullの可能性がある場合は、そのままTrimしない
  • ?.Trim()を使えばnullを考慮できる
  • ?.Trim() ?? ""ならnullを空文字に変換できる
  • 未入力判定にはIsNullOrWhiteSpace()が便利
  • Trimした結果は元のstringを直接変更するのではなく、新しい文字列として返される
  • Trimはセキュリティ対策そのものではない
  • データベースや外部システムへ渡す場合は、別途適切なセキュリティ対策が必要
  • すべての文字列を無条件にTrimしてよいとは限らない

特に実務で覚えておきたいのは、次の2つです。

// nullなら空文字、それ以外なら前後の空白を削除
string value = input?.Trim() ?? "";

// null、空文字、空白だけなら未入力
if (string.IsNullOrWhiteSpace(input))
{
    // 未入力として処理する
}
C#

「Trimする」「未入力か判定する」「入力値を検証する」という処理をそれぞれ別の役割として考えることが、保守しやすく安全なC#コードを書くためのポイントです。

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