C# string完全ガイド|宣言・結合・比較・変換・Stringとの違いを初心者向けに解説

はじめに

C#でプログラミングを始めると、必ず使うことになるのがstringです。stringは、名前、メッセージ、ファイルパス、メールアドレス、検索キーワード、CSVデータなど、文字列を扱うための基本的な型です。

たとえば、画面に「こんにちは」と表示したり、ユーザーが入力した名前を保存したり、数値を文字列として整形したりする場面でstringを使います。

この記事では、C#のstringについて、宣言、初期化、結合、比較、変換、よく使うメソッド、Stringとの違い、StringBuilderとの使い分けまで初心者向けにわかりやすく解説します。

コード例も多く紹介するので、C#の文字列操作を基礎から実務レベルまで理解したい方は、ぜひ参考にしてください。

1. C#のstringとは?初心者向けに基本をわかりやすく解説

C#のstringとは、文字や文章などの「文字列」を扱うためのデータ型です。

プログラムでは、数値だけでなく、名前、住所、メッセージ、ファイル名、URLなど、さまざまな文字情報を扱います。これらを保存したり加工したりするために使うのがstringです。

1-1. stringは文字列を扱うためのデータ型

stringは、複数の文字をまとめて扱うための型です。

C#
string message = "こんにちは";
string name = "Taro";
string email = "taro@example.com";

このように、ダブルクォーテーション"で囲んだ文字列をstring型の変数に代入できます。

C#では、文字列を扱う処理が非常に多いため、stringはもっともよく使う型のひとつです。

1-2. C#における文字列の基本的な考え方

C#の文字列は、文字が順番に並んだデータです。

C#
string text = "ABC";

この文字列は、内部的にはABCという文字が並んでいるイメージです。

ただし、C#のstringは一度作成すると中身を直接変更できません。この性質を「不変性」と呼びます。

C#
string text = "Hello";
text = text + " World";

上記のコードは、元のHelloを書き換えているように見えますが、実際にはHello Worldという新しい文字列を作成し、textがそれを参照するようになります。

1-3. stringで扱える文字・文章・空文字の例

stringでは、英数字、日本語、記号、空文字などを扱えます。

C#
string english = "Hello";
string japanese = "こんにちは";
string numberText = "12345";
string symbol = "@#$%";
string empty = "";

数値のように見える"12345"も、ダブルクォーテーションで囲まれている場合は文字列です。

C#
int number = 12345;
string text = "12345";

numberは数値として計算できますが、textは文字列なので、そのままでは数値計算には使えません。必要に応じて変換が必要です。

1-4. stringを学ぶとできるようになること

C#のstringを理解すると、次のような処理ができるようになります。

C#
string firstName = "Taro";
string lastName = "Yamada";

string fullName = lastName + " " + firstName;

Console.WriteLine(fullName);

実行結果は次のとおりです。

C#
Yamada Taro

また、文字列の検索、置換、分割、比較、入力チェック、数値変換なども行えるようになります。

C#
string keyword = "C#";
string title = "C# string完全ガイド";

bool contains = title.Contains(keyword);

Console.WriteLine(contains);

stringは、C#でアプリケーションを作るうえで欠かせない基本機能です。

2. C# stringの宣言と初期化方法

C#でstringを使うには、変数を宣言して文字列を代入します。

宣言とは「変数を使えるようにすること」、初期化とは「最初の値を代入すること」です。

2-1. string変数を宣言する基本構文

string変数は、次のように宣言します。

C#
string 変数名;

例は次のとおりです。

C#
string name;

この時点では、nameという文字列用の変数を用意しただけです。ローカル変数の場合、値を代入する前に使おうとするとコンパイルエラーになります。

C#
string name;
Console.WriteLine(name); // エラー

使用する前に値を代入しましょう。

C#
string name;
name = "Taro";

Console.WriteLine(name);

2-2. 文字列リテラルを代入する方法

文字列リテラルとは、コード中に直接書かれた文字列のことです。

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

"こんにちは"が文字列リテラルです。

次のように、宣言と同時に初期化する書き方がよく使われます。

C#
string name = "Yamada";
string greeting = "Hello";
string url = "https://example.com";

初心者のうちは、string 変数名 = "文字列";という形を基本として覚えるとよいでしょう。

2-3. 空文字を代入する方法

空文字とは、文字が1つも入っていない文字列です。

C#
string text = "";

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

C#
string text = string.Empty;

どちらも意味はほぼ同じです。

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

空文字は、入力欄が空だった場合や、初期値として文字列を空にしておきたい場合によく使われます。

2-4. nullを代入する場合の注意点

nullは「何も参照していない状態」を表します。

C#
string name = null;

空文字""とは意味が異なります。

C#
string empty = "";
string none = null;

emptyは「文字数0の文字列」です。一方、noneは「文字列オブジェクトが存在しない状態」です。

そのため、nullの変数に対してメソッドやプロパティを呼び出すとエラーになります。

C#
string name = null;

Console.WriteLine(name.Length); // NullReferenceException

安全に扱うには、nullチェックを行います。

C#
string name = null;

if (name != null)
{
Console.WriteLine(name.Length);
}

または、string.IsNullOrEmptyを使うと便利です。

C#
if (string.IsNullOrEmpty(name))
{
Console.WriteLine("名前が入力されていません");
}

2-5. varを使ってstringを宣言する方法

C#では、varを使って型推論で変数を宣言できます。

C#
var message = "こんにちは";

この場合、右辺が文字列リテラルなので、messagestring型として扱われます。

次のコードと同じ意味です。

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

ただし、varは型がなくなるわけではありません。コンパイラが型を判断しているだけです。

C#
var name = "Taro"; // string型
var age = 20; // int型

初心者のうちは、型を明確にしたい場面ではstringと書く方が読みやすい場合もあります。

2-6. const stringとreadonly stringの違い

const stringは、コンパイル時に値が決まる定数です。

C#
const string AppName = "SampleApp";

constで宣言した値は、後から変更できません。

C#
const string AppName = "SampleApp";
// AppName = "NewApp"; // エラー

一方、readonlyはフィールドに対して使い、宣言時またはコンストラクター内で値を設定できます。

C#
class AppConfig
{
public readonly string AppName;

public AppConfig(string appName)
{
AppName = appName;
}
}

違いを簡単にまとめると、constはコンパイル時に決まる固定値、readonlyは実行時に決められるが、その後は変更できない値です。

アプリ名や固定メッセージなど、完全に変わらない値にはconst stringを使えます。設定値やコンストラクターで受け取る値にはreadonly stringが向いています。

3. stringとStringの違い

C#では、stringStringの両方を見かけることがあります。

C#
string name1 = "Taro";
String name2 = "Jiro";

初心者にとっては違いがわかりにくいですが、基本的には同じものを指しています。

3-1. stringとSystem.Stringの関係

stringは、System.Stringの別名です。

C#
string text1 = "Hello";
System.String text2 = "Hello";

この2つはどちらも同じ文字列型です。

C#では、よく使う.NETの型に対してキーワードの別名が用意されています。

C#
int    // System.Int32
long // System.Int64
bool // System.Boolean
string // System.String

つまり、stringはC#で用意された書きやすい表記であり、実体はSystem.Stringです。

3-2. stringはC#のキーワード、Stringは.NETのクラス

stringはC#のキーワードです。

C#
string message = "Hello";

一方、Stringは.NETのクラス名です。通常はusing System;を使っているため、Stringと書けます。

C#
using System;

String message = "Hello";

System.Stringと完全に書くこともできます。

C#
System.String message = "Hello";

ただし、C#のコードでは型名としてはstringを使うことが一般的です。

3-3. 実務ではstringとStringのどちらを使うべきか

実務では、変数や戻り値の型にはstringを使うことが多いです。

C#
string name = "Taro";
string GetMessage()
{
return "Hello";
}

一方、静的メソッドを呼び出す場合は、stringでもStringでも書けます。

C#
bool result1 = string.IsNullOrEmpty(name);
bool result2 = String.IsNullOrEmpty(name);

C#では、組み込み型のエイリアスであるstringを使うスタイルが一般的です。

迷った場合は、次のように覚えておくとよいでしょう。

C#
string name = "Taro";
bool isEmpty = string.IsNullOrEmpty(name);

型名としても静的メソッド呼び出しとしても、stringに統一すると読みやすいコードになります。

3-4. string.Emptyと""の違い

string.Empty""は、どちらも空文字を表します。

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

どちらを使っても、文字数は0です。

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

実務では、どちらを使うかはチームのコーディング規約によります。

短く書きたい場合は""、意味を明確にしたい場合はstring.Emptyが使われます。

C#
string name = string.Empty;

ただし、文字列補間や初期化では""の方が自然なこともあります。

C#
string result = "";

重要なのは、同じプロジェクト内で書き方を統一することです。

3-5. stringとcharの違い

stringは文字列、charは1文字を表します。

C#
char c = 'A';
string s = "A";

charはシングルクォーテーション'で囲みます。

C#
char letter = 'A';

stringはダブルクォーテーション"で囲みます。

C#
string text = "A";

見た目は似ていますが、型が違います。

C#
char c = 'A';
string s = "A";

charは1文字だけを扱いたい場合に使います。stringは1文字以上の文字列、または空文字を扱う場合に使います。

C#
string empty = ""; // OK
char emptyChar = ''; // エラー

4. C# stringの結合方法

C#では、複数の文字列をつなげる方法がいくつかあります。

代表的な方法は、+演算子、+=string.Concatstring.Join、文字列補間、StringBuilderです。

用途に応じて使い分けることで、読みやすく効率のよいコードになります。

4-1. +演算子で文字列を結合する

もっとも基本的な文字列結合は、+演算子を使う方法です。

C#
string firstName = "Taro";
string lastName = "Yamada";

string fullName = lastName + " " + firstName;

Console.WriteLine(fullName);

実行結果は次のとおりです。

C#
Yamada Taro

短い文字列を少しだけ結合する場合は、+演算子で問題ありません。

C#
string message = "こんにちは、" + name + "さん";

ただし、結合する要素が多くなると読みづらくなります。その場合は、文字列補間を使うと見やすくなります。

4-2. +=で文字列を追加する

既存の文字列に文字を追加したい場合は、+=を使えます。

C#
string text = "Hello";
text += " ";
text += "World";

Console.WriteLine(text);

実行結果は次のとおりです。

C#
Hello World

ただし、stringは不変なので、+=を使うたびに新しい文字列が作られます。

少数回の追加であれば問題ありませんが、ループ内で大量に結合する場合はStringBuilderを検討しましょう。

4-3. string.Concatを使う方法

string.Concatを使うと、複数の文字列を連結できます。

C#
string result = string.Concat("C#", " ", "string", " ", "Guide");

Console.WriteLine(result);

実行結果は次のとおりです。

C#
C# string Guide

string.Concatは、単純に文字列をつなげたい場合に使えます。

C#
string first = "Hello";
string second = "World";

string message = string.Concat(first, second);

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

C#
HelloWorld

区切り文字は自動では入りません。スペースやカンマを入れたい場合は、自分で指定する必要があります。

C#
string message = string.Concat(first, " ", second);

4-4. string.Joinで配列やリストを結合する

配列やリストの要素を区切り文字付きで結合したい場合は、string.Joinが便利です。

C#
string[] names = { "Taro", "Jiro", "Hanako" };

string result = string.Join(", ", names);

Console.WriteLine(result);

実行結果は次のとおりです。

C#
Taro, Jiro, Hanako

CSVのような文字列を作りたい場合にも使えます。

C#
int[] numbers = { 10, 20, 30 };

string csv = string.Join(",", numbers);

Console.WriteLine(csv);

実行結果は次のとおりです。

C#
10,20,30

string.Joinは、配列やリストを文字列にまとめる場面で非常によく使われます。

4-5. 文字列補間で読みやすく結合する

文字列補間は、文字列の中に変数や式を埋め込める便利な書き方です。

C#
string name = "Taro";
int age = 25;

string message = $"名前は{name}、年齢は{age}歳です。";

Console.WriteLine(message);

実行結果は次のとおりです。

C#
名前はTaro、年齢は25歳です。

+演算子で書くと次のようになります。

C#
string message = "名前は" + name + "、年齢は" + age + "歳です。";

文字列補間を使うと、文章の形がそのまま見えるため読みやすくなります。

日付や数値の書式指定もできます。

C#
DateTime today = DateTime.Now;
string text = $"今日は{today:yyyy年MM月dd日}です。";

Console.WriteLine(text);

4-6. StringBuilderを使うべきケース

StringBuilderは、文字列を効率よく組み立てるためのクラスです。

使うには、System.Text名前空間を指定します。

C#
using System.Text;

StringBuilder sb = new StringBuilder();

sb.Append("Hello");
sb.Append(" ");
sb.Append("World");

string result = sb.ToString();

Console.WriteLine(result);

実行結果は次のとおりです。

C#
Hello World

StringBuilderは、ループで大量の文字列を結合する場合に向いています。

C#
using System.Text;

StringBuilder sb = new StringBuilder();

for (int i = 1; i <= 1000; i++)
{
sb.Append(i);
sb.Append(",");
}

string result = sb.ToString();

string+=で大量に結合すると、そのたびに新しい文字列が作られるため、パフォーマンスが悪くなることがあります。

4-7. string結合で避けたい書き方

避けたい代表的な書き方は、ループ内で+=を使って大量に文字列を結合することです。

C#
string result = "";

for (int i = 0; i < 10000; i++)
{
result += i.ToString();
}

このコードは動作しますが、繰り返し新しい文字列が作られるため、効率がよくありません。

このような場合は、StringBuilderを使います。

C#
using System.Text;

StringBuilder sb = new StringBuilder();

for (int i = 0; i < 10000; i++)
{
sb.Append(i);
}

string result = sb.ToString();

短い結合なら+や文字列補間、大量の結合ならStringBuilderと覚えるとよいでしょう。

5. C# stringの比較方法

C#で文字列を比較する方法には、==演算子、Equalsメソッド、Compareメソッドなどがあります。

文字列比較では、大文字・小文字を区別するか、文化依存の比較をするかなどが重要です。

5-1. ==演算子で文字列を比較する

C#では、==演算子で文字列の内容を比較できます。

C#
string a = "Hello";
string b = "Hello";

Console.WriteLine(a == b);

実行結果は次のとおりです。

C#
True

stringは参照型ですが、==演算子は文字列の内容を比較するように定義されています。

C#
string a = "C#";
string b = "Java";

Console.WriteLine(a == b);

実行結果は次のとおりです。

C#
False

単純な一致判定であれば、==は直感的で使いやすい方法です。

5-2. Equalsメソッドで比較する

Equalsメソッドを使って比較することもできます。

C#
string a = "Hello";
string b = "Hello";

bool result = a.Equals(b);

Console.WriteLine(result);

実行結果は次のとおりです。

C#
True

ただし、左側の変数がnullの場合は注意が必要です。

C#
string a = null;
string b = "Hello";

bool result = a.Equals(b); // NullReferenceException

安全に比較したい場合は、静的メソッドのstring.Equalsを使うと便利です。

C#
string a = null;
string b = "Hello";

bool result = string.Equals(a, b);

Console.WriteLine(result);

この場合、例外は発生せず、Falseになります。

5-3. Compareメソッドで大小比較する

string.Compareを使うと、文字列の大小関係を比較できます。

C#
int result = string.Compare("apple", "banana");

Console.WriteLine(result);

戻り値は次のような意味を持ちます。

C#
// 0より小さい: 1つ目の文字列が小さい
// 0: 等しい
// 0より大きい: 1つ目の文字列が大きい

たとえば、並び替えや辞書順の比較をしたい場合に使います。

C#
string a = "apple";
string b = "banana";

if (string.Compare(a, b, StringComparison.Ordinal) < 0)
{
Console.WriteLine($"{a}は{b}より前です");
}

単純な一致判定には==Equals、順序比較にはCompareを使うとよいでしょう。

5-4. 大文字・小文字を区別しない比較方法

大文字・小文字を区別せずに比較したい場合は、StringComparison.OrdinalIgnoreCaseを指定します。

C#
string a = "hello";
string b = "HELLO";

bool result = string.Equals(a, b, StringComparison.OrdinalIgnoreCase);

Console.WriteLine(result);

実行結果は次のとおりです。

C#
True

次のように、両方を小文字に変換して比較する方法もあります。

C#
bool result = a.ToLower() == b.ToLower();

しかし、この方法は余計な文字列を作成したり、文化依存の問題が発生したりする可能性があります。

比較には、できるだけStringComparisonを指定しましょう。

C#
bool result = string.Equals(a, b, StringComparison.OrdinalIgnoreCase);

5-5. nullを含む比較で注意すべきポイント

文字列比較では、nullを含む可能性がある場合に注意が必要です。

C#
string a = null;
string b = "test";

Console.WriteLine(a == b);

このコードは例外にならず、Falseになります。

しかし、次のコードは例外になります。

C#
string a = null;
string b = "test";

Console.WriteLine(a.Equals(b)); // NullReferenceException

左側の変数がnullの可能性がある場合は、string.Equalsを使うと安全です。

C#
bool result = string.Equals(a, b, StringComparison.Ordinal);

nullを含む比較では、「変数のメソッドを呼ぶ」のではなく、「stringの静的メソッドを使う」と覚えると安全です。

5-6. 文字列比較でStringComparisonを指定すべき理由

文字列比較では、比較ルールを明確にするためにStringComparisonを指定することが重要です。

C#
string a = "file";
string b = "FILE";

bool result = string.Equals(a, b, StringComparison.OrdinalIgnoreCase);

StringComparisonを指定すると、大文字・小文字を区別するか、カルチャを考慮するかを明確にできます。

よく使う指定は次のとおりです。

C#
StringComparison.Ordinal
StringComparison.OrdinalIgnoreCase
StringComparison.CurrentCulture
StringComparison.CurrentCultureIgnoreCase

ID、キー、ファイル名、コード値など、機械的に比較する文字列ではOrdinalまたはOrdinalIgnoreCaseがよく使われます。

C#
bool isMatch = string.Equals(input, "admin", StringComparison.OrdinalIgnoreCase);

ユーザーに表示する自然言語の並び替えなどでは、カルチャを考慮した比較が必要になる場合もあります。

初心者のうちは、厳密な一致比較にはStringComparison.Ordinal、大文字・小文字を無視したい場合はStringComparison.OrdinalIgnoreCaseを使うと覚えておくとよいでしょう。

6. C# stringの変換方法

C#では、数値や日付をstringに変換したり、逆にstringintdoubleに変換したりする場面がよくあります。

文字列変換は、入力処理、画面表示、ファイル読み書き、API通信などで頻繁に使います。

6-1. 数値をstringに変換する方法

数値をstringに変換するには、ToStringメソッドを使います。

C#
int number = 123;
string text = number.ToString();

Console.WriteLine(text);

実行結果は次のとおりです。

C#
123

文字列補間を使って変換することもできます。

C#
int age = 25;
string message = $"年齢は{age}歳です。";

数値を特定の形式で文字列にしたい場合は、書式指定を使います。

C#
int price = 1200;
string text = price.ToString("N0");

Console.WriteLine(text);

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

C#
1,200

6-2. stringをintやdoubleに変換する方法

文字列を整数に変換するには、int.Parseを使います。

C#
string text = "123";
int number = int.Parse(text);

Console.WriteLine(number);

小数に変換する場合は、double.Parseを使います。

C#
string text = "3.14";
double value = double.Parse(text);

Console.WriteLine(value);

ただし、変換できない文字列を指定すると例外が発生します。

C#
string text = "abc";
int number = int.Parse(text); // FormatException

ユーザー入力など、変換できるかわからない文字列にはTryParseを使うのが安全です。

6-3. ToStringメソッドの基本

ToStringは、値を文字列表現に変換するメソッドです。

C#
int number = 100;
string text = number.ToString();

doubleDateTimeなどでも使えます。

C#
double rate = 0.1234;
string rateText = rate.ToString();

DateTime now = DateTime.Now;
string dateText = now.ToString();

書式を指定することもできます。

C#
double value = 1234.567;
string text = value.ToString("F2");

Console.WriteLine(text);

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

C#
1234.57

F2は小数点以下2桁で表示する指定です。

6-4. ParseとTryParseの違い

Parseは、変換できない文字列を渡すと例外が発生します。

C#
string text = "123";
int number = int.Parse(text);

次のような文字列では例外になります。

C#
string text = "abc";
int number = int.Parse(text); // FormatException

一方、TryParseは変換に成功したかどうかをboolで返します。

C#
string text = "123";

if (int.TryParse(text, out int number))
{
Console.WriteLine($"変換成功: {number}");
}
else
{
Console.WriteLine("変換できませんでした");
}

ユーザー入力、CSV、外部ファイル、APIレスポンスなど、値が正しいとは限らない場合はTryParseを使うのが安全です。

6-5. Convert.ToStringの使い方

Convert.ToStringを使って、値を文字列に変換することもできます。

C#
int number = 123;
string text = Convert.ToString(number);

Console.WriteLine(text);

Convert.ToStringの特徴は、nullを渡しても例外にならず、空文字を返すことです。

C#
object value = null;
string text = Convert.ToString(value);

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

一方、ToStringは対象がnullだと呼び出せません。

C#
object value = null;
string text = value.ToString(); // NullReferenceException

nullの可能性がある値を文字列化する場合は、Convert.ToStringやnull条件演算子を検討しましょう。

C#
string text = value?.ToString() ?? "";

6-6. 日付をstringに変換する方法

日付をstringに変換するには、DateTimeToStringを使います。

C#
DateTime today = DateTime.Now;

string text = today.ToString("yyyy/MM/dd");

Console.WriteLine(text);

実行結果の例は次のとおりです。

C#
2026/06/15

日本語の形式で表示することもできます。

C#
string text = today.ToString("yyyy年MM月dd日");

時刻を含める場合は、次のように書きます。

C#
string text = today.ToString("yyyy/MM/dd HH:mm:ss");

文字列補間でも書式指定ができます。

C#
string message = $"現在日時: {today:yyyy/MM/dd HH:mm:ss}";

画面表示やログ出力では、日付の書式を明確に指定するとわかりやすくなります。

6-7. 文字列変換で例外を防ぐ書き方

文字列を数値に変換する場合、ParseではなくTryParseを使うと例外を防げます。

C#
string input = "100";

if (int.TryParse(input, out int number))
{
Console.WriteLine(number * 2);
}
else
{
Console.WriteLine("数値を入力してください");
}

小数の場合も同様です。

C#
string input = "3.14";

if (double.TryParse(input, out double value))
{
Console.WriteLine(value);
}
else
{
Console.WriteLine("小数に変換できません");
}

nullの可能性がある値に対してToStringを呼ぶ場合は、null条件演算子を使えます。

C#
object value = null;

string text = value?.ToString() ?? "";

安全な変換を意識することで、実行時エラーの少ないコードになります。

7. C# stringでよく使うメソッド一覧

stringには、文字列を調べたり、加工したりするための便利なメソッドが多数用意されています。

ここでは、初心者がまず覚えておきたい代表的なメソッドを紹介します。

7-1. Lengthで文字数を取得する

Lengthプロパティを使うと、文字列の長さを取得できます。

C#
string text = "Hello";

Console.WriteLine(text.Length);

実行結果は次のとおりです。

C#
5

日本語でも使えます。

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

Console.WriteLine(text.Length);

実行結果は次のとおりです。

C#
5

ただし、Lengthは厳密にはUTF-16のcharの数を返します。絵文字や結合文字を含む場合、人間が見た文字数と一致しないことがあります。

C#
string emoji = "😀";

Console.WriteLine(emoji.Length); // 2になる場合がある

通常の英数字や日本語を扱う範囲では、文字数の目安としてよく使えます。

7-2. Containsで文字列を含むか判定する

Containsを使うと、指定した文字列を含むかどうかを判定できます。

C#
string text = "C# string完全ガイド";

bool result = text.Contains("string");

Console.WriteLine(result);

実行結果は次のとおりです。

C#
True

検索機能や入力チェックでよく使います。

C#
string email = "taro@example.com";

if (email.Contains("@"))
{
Console.WriteLine("メールアドレスの形式に見えます");
}

大文字・小文字を区別せずに判定したい場合は、対応する環境でStringComparisonを指定する方法を使うとよいです。

C#
bool result = text.Contains("STRING", StringComparison.OrdinalIgnoreCase);

7-3. StartsWithとEndsWithで先頭・末尾を判定する

StartsWithは、文字列が指定した文字列で始まるかを判定します。

C#
string url = "https://example.com";

bool result = url.StartsWith("https://");

Console.WriteLine(result);

実行結果は次のとおりです。

C#
True

EndsWithは、文字列が指定した文字列で終わるかを判定します。

C#
string fileName = "sample.txt";

bool result = fileName.EndsWith(".txt");

Console.WriteLine(result);

実行結果は次のとおりです。

C#
True

ファイル拡張子の判定やURLチェックなどでよく使われます。

C#
if (fileName.EndsWith(".csv", StringComparison.OrdinalIgnoreCase))
{
Console.WriteLine("CSVファイルです");
}

7-4. IndexOfで文字の位置を検索する

IndexOfを使うと、指定した文字列が最初に現れる位置を取得できます。

C#
string text = "Hello World";

int index = text.IndexOf("World");

Console.WriteLine(index);

実行結果は次のとおりです。

C#
6

位置は0から数えます。

C#
H e l l o   W o r l d
0 1 2 3 4 5 6 7 8 9 10

見つからない場合は-1が返ります。

C#
string text = "Hello";

int index = text.IndexOf("C#");

Console.WriteLine(index); // -1

検索結果を使って条件分岐する場合は、次のように書けます。

C#
if (text.IndexOf("Hello", StringComparison.Ordinal) >= 0)
{
Console.WriteLine("見つかりました");
}

7-5. Substringで文字列を切り出す

Substringを使うと、文字列の一部を取り出せます。

C#
string text = "Hello World";

string part = text.Substring(0, 5);

Console.WriteLine(part);

実行結果は次のとおりです。

C#
Hello

第1引数は開始位置、第2引数は取り出す文字数です。

C#
string text = "abcdef";

string part = text.Substring(2, 3);

Console.WriteLine(part);

実行結果は次のとおりです。

C#
cde

範囲外を指定すると例外が発生します。

C#
string text = "abc";
string part = text.Substring(5); // エラー

Substringを使う前に、文字列の長さを確認すると安全です。

C#
if (text.Length >= 5)
{
string part = text.Substring(0, 5);
}

7-6. Replaceで文字列を置換する

Replaceを使うと、指定した文字列を別の文字列に置き換えられます。

C#
string text = "Hello World";

string result = text.Replace("World", "C#");

Console.WriteLine(result);

実行結果は次のとおりです。

C#
Hello C#

空文字に置き換えることで、文字列を削除することもできます。

C#
string text = "2026/06/15";

string result = text.Replace("/", "");

Console.WriteLine(result);

実行結果は次のとおりです。

C#
20260615

Replaceも元の文字列を直接変更するのではなく、新しい文字列を返します。

C#
string text = "abc";
text.Replace("a", "A");

Console.WriteLine(text); // abc

変更後の文字列を使うには、戻り値を受け取る必要があります。

C#
text = text.Replace("a", "A");

7-7. Splitで文字列を分割する

Splitを使うと、文字列を指定した区切り文字で分割できます。

C#
string csv = "apple,banana,orange";

string[] fruits = csv.Split(',');

foreach (string fruit in fruits)
{
Console.WriteLine(fruit);
}

実行結果は次のとおりです。

C#
apple
banana
orange

スペースで分割することもできます。

C#
string text = "C# string guide";

string[] words = text.Split(' ');

CSV、ログ、入力値などを分解したい場合によく使います。

ただし、本格的なCSVでは、カンマを含む引用符付き文字列などがあるため、単純なSplit(',')だけでは正しく処理できない場合があります。

7-8. Trimで前後の空白を削除する

Trimを使うと、文字列の前後にある空白を削除できます。

C#
string text = "  Hello  ";

string result = text.Trim();

Console.WriteLine(result);

実行結果は次のとおりです。

C#
Hello

前だけ削除する場合はTrimStart、後ろだけ削除する場合はTrimEndを使います。

C#
string text = "  Hello  ";

string start = text.TrimStart();
string end = text.TrimEnd();

ユーザー入力では、前後に不要なスペースが入ることがあります。そのため、入力チェック前にTrimを使うことがよくあります。

C#
string input = "  Taro  ";
string name = input.Trim();

7-9. ToUpperとToLowerで大文字・小文字を変換する

ToUpperは文字列を大文字に変換します。

C#
string text = "hello";

string result = text.ToUpper();

Console.WriteLine(result);

実行結果は次のとおりです。

C#
HELLO

ToLowerは文字列を小文字に変換します。

C#
string text = "HELLO";

string result = text.ToLower();

Console.WriteLine(result);

実行結果は次のとおりです。

C#
hello

検索や表示形式の統一に使えます。

ただし、文字列比較のために大文字・小文字を変換するよりも、StringComparison.OrdinalIgnoreCaseを使う方が適切な場合が多いです。

C#
bool result = string.Equals(a, b, StringComparison.OrdinalIgnoreCase);

8. C# stringのnull・空文字・空白の違い

C#のstringで初心者が混乱しやすいのが、null、空文字、空白文字列の違いです。

これらは似ていますが、意味が異なります。

8-1. nullとは何か

nullは、変数が何も参照していない状態です。

C#
string text = null;

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

そのため、LengthContainsなどを呼び出すと例外が発生します。

C#
string text = null;

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

nullの可能性がある場合は、事前にチェックが必要です。

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

8-2. 空文字とは何か

空文字は、文字が1つも入っていない文字列です。

C#
string text = "";

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

C#
string text = string.Empty;

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

C#
string text = "";

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

nullとは異なり、「存在するが中身が空」という状態です。

8-3. 空白文字列とは何か

空白文字列は、スペースやタブなどの空白文字を含む文字列です。

C#
string text1 = " ";
string text2 = " ";
string text3 = "\t";

空白文字列は、空文字ではありません。

C#
string text = " ";

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

見た目では何も入力されていないように見えることがありますが、実際には空白文字が入っています。

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

8-4. IsNullOrEmptyの使い方

string.IsNullOrEmptyは、文字列がnullまたは空文字かどうかを判定します。

C#
string text = "";

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

次のような場合にtrueになります。

C#
string a = null;
string b = "";

Console.WriteLine(string.IsNullOrEmpty(a)); // True
Console.WriteLine(string.IsNullOrEmpty(b)); // True

ただし、空白文字列はfalseになります。

C#
string text = " ";

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

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

8-5. IsNullOrWhiteSpaceの使い方

string.IsNullOrWhiteSpaceは、文字列がnull、空文字、または空白文字だけかどうかを判定します。

C#
string text = "   ";

if (string.IsNullOrWhiteSpace(text))
{
Console.WriteLine("入力が空です");
}

次のような値はすべてtrueになります。

C#
Console.WriteLine(string.IsNullOrWhiteSpace(null)); // True
Console.WriteLine(string.IsNullOrWhiteSpace("")); // True
Console.WriteLine(string.IsNullOrWhiteSpace(" ")); // True
Console.WriteLine(string.IsNullOrWhiteSpace("\t")); // True

ユーザー入力のチェックでは、IsNullOrWhiteSpaceを使うことが多いです。

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

8-6. nullチェックでよくあるエラーと対策

よくあるエラーは、nullの文字列に対してメソッドを呼んでしまうことです。

C#
string text = null;

if (text.Contains("C#"))
{
Console.WriteLine("含まれています");
}

このコードはNullReferenceExceptionになります。

対策として、先にnullチェックを行います。

C#
if (text != null && text.Contains("C#"))
{
Console.WriteLine("含まれています");
}

または、null条件演算子を使えます。

C#
if (text?.Contains("C#") == true)
{
Console.WriteLine("含まれています");
}

入力チェックの場合は、次のように書くと安全です。

C#
if (!string.IsNullOrWhiteSpace(text))
{
Console.WriteLine(text.Trim());
}

null、空文字、空白文字列を区別できるようになると、文字列処理のエラーを大きく減らせます。

9. C# stringの不変性とパフォーマンス

C#のstringは不変オブジェクトです。

不変とは、一度作成された文字列の中身を変更できないという意味です。

この性質は安全性の面でメリットがありますが、大量の文字列結合ではパフォーマンスに影響することがあります。

9-1. stringは変更できない不変オブジェクト

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

C#
string text = "Hello";
text = text + " World";

一見すると、textの中身が変更されたように見えます。

しかし実際には、元の"Hello"が変更されたのではなく、新しく"Hello World"という文字列が作られています。

text変数が新しい文字列を参照するようになっただけです。

C#
string text = "Hello";
string newText = text.Replace("H", "J");

Console.WriteLine(text); // Hello
Console.WriteLine(newText); // Jello

Replaceも元の文字列を変更せず、新しい文字列を返します。

9-2. 文字列を書き換えているように見える仕組み

次のコードでは、textが何度も変更されているように見えます。

C#
string text = "A";
text += "B";
text += "C";

Console.WriteLine(text);

実行結果は次のとおりです。

C#
ABC

しかし内部的には、次のように新しい文字列が作られています。

C#
"A"
"AB"
"ABC"

小さな処理では問題ありませんが、何千回、何万回も繰り返すと、不要な文字列が大量に作られてしまいます。

そのため、大量の結合にはStringBuilderを使う方が効率的です。

9-3. 大量の文字列結合で処理が重くなる理由

stringをループで結合すると、毎回新しい文字列が作成されます。

C#
string result = "";

for (int i = 0; i < 10000; i++)
{
result += i;
}

この場合、ループのたびに新しいresultが作られます。

文字列が長くなるほどコピーする量も増えるため、処理が重くなる可能性があります。

一方、StringBuilderは内部のバッファを使って効率よく文字列を組み立てます。

C#
using System.Text;

StringBuilder sb = new StringBuilder();

for (int i = 0; i < 10000; i++)
{
sb.Append(i);
}

string result = sb.ToString();

大量の結合では、StringBuilderを使うことでメモリ使用量や処理時間を抑えやすくなります。

9-4. StringBuilderを使う判断基準

StringBuilderを使うかどうかは、結合回数やコードの読みやすさで判断します。

短い結合であれば、+演算子や文字列補間で十分です。

C#
string message = $"{name}さん、こんにちは";

配列やリストを区切り文字で結合するなら、string.Joinが向いています。

C#
string result = string.Join(",", values);

ループ内で何度も追加するなら、StringBuilderが向いています。

C#
StringBuilder sb = new StringBuilder();

foreach (string item in items)
{
sb.AppendLine(item);
}

目安として、数回程度の結合ならstring、大量の繰り返し結合ならStringBuilderと考えるとよいでしょう。

9-5. メモリ効率を意識したstringの扱い方

文字列処理でメモリ効率を意識するには、不要な中間文字列を作らないことが大切です。

たとえば、比較のためだけに小文字へ変換するコードは避けた方がよい場合があります。

C#
if (input.ToLower() == "admin")
{
Console.WriteLine("管理者です");
}

このコードでは、小文字変換後の新しい文字列が作られます。

代わりに、StringComparison.OrdinalIgnoreCaseを使うと効率的で意図も明確です。

C#
if (string.Equals(input, "admin", StringComparison.OrdinalIgnoreCase))
{
Console.WriteLine("管理者です");
}

また、複数要素の結合にはstring.Joinを使うと、読みやすく効率的です。

C#
string result = string.Join(", ", names);

stringの不変性を理解すると、パフォーマンスを意識したコードが書きやすくなります。

10. C# stringのエスケープ文字と特殊な書き方

C#では、文字列の中に改行、タブ、ダブルクォーテーション、バックスラッシュなどを含めたい場合があります。

そのために使うのがエスケープ文字や特殊な文字列リテラルです。

10-1. 改行を表す\nの使い方

文字列の中で改行を表すには、\nを使います。

C#
string text = "Hello\nWorld";

Console.WriteLine(text);

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

C#
Hello
World

複数行のメッセージを作りたい場合に便利です。

C#
string message = "1行目\n2行目\n3行目";

Windows環境の改行として\r\nを使う場合もあります。

C#
string text = "Hello\r\nWorld";

環境に応じた改行を使いたい場合は、Environment.NewLineを使えます。

C#
string text = "Hello" + Environment.NewLine + "World";

10-2. タブを表す\tの使い方

タブを表すには、\tを使います。

C#
string text = "Name\tAge";

Console.WriteLine(text);

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

C#
Name    Age

簡単な表形式の出力に使えます。

C#
Console.WriteLine("商品名\t価格");
Console.WriteLine("りんご\t100");
Console.WriteLine("みかん\t80");

ただし、きれいな表を作りたい場合は、文字幅の違いによってずれることがあります。必要に応じて書式指定を使いましょう。

10-3. ダブルクォーテーションを文字列に含める方法

文字列の中にダブルクォーテーションを含めたい場合は、\"を使います。

C#
string text = "彼は\"こんにちは\"と言いました。";

Console.WriteLine(text);

実行結果は次のとおりです。

C#
彼は"こんにちは"と言いました。

ダブルクォーテーションは文字列の開始と終了を表す記号なので、そのまま書くとエラーになります。

C#
string text = "彼は"こんにちは"と言いました。"; // エラー

文字として含めたい場合は、エスケープが必要です。

10-4. パス文字列で使う逐語的文字列リテラル

Windowsのファイルパスでは、バックスラッシュ\をよく使います。

通常の文字列では、バックスラッシュはエスケープ文字として扱われるため、次のように重ねて書く必要があります。

C#
string path = "C:\\Users\\Taro\\Documents\\file.txt";

これを読みやすくするために、逐語的文字列リテラルを使えます。

C#
string path = @"C:\Users\Taro\Documents\file.txt";

先頭に@を付けると、バックスラッシュをそのまま扱えます。

ファイルパスや正規表現のように、バックスラッシュが多い文字列で便利です。

10-5. 複数行文字列の書き方

逐語的文字列リテラルを使うと、複数行の文字列も書けます。

C#
string text = @"1行目
2行目
3行目";

Console.WriteLine(text);

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

C#
1行目
2行目
3行目

SQLやテンプレート文など、複数行の文字列を扱う場合に便利です。

C#
string sql = @"
SELECT *
FROM Users
WHERE Age >= 20
";

ただし、インデントや改行も文字列に含まれるため、出力結果に注意しましょう。

10-6. 生文字列リテラルの基本

C#では、生文字列リテラルを使うと、複雑な文字列を読みやすく書けます。

生文字列リテラルは、3つ以上のダブルクォーテーションで囲みます。

C#
string json = """
{
"name": "Taro",
"age": 25
}
""";

Console.WriteLine(json);

JSON、HTML、SQLなど、ダブルクォーテーションや改行を多く含む文字列を書くときに便利です。

文字列補間と組み合わせることもできます。

C#
string name = "Taro";

string json = $$"""
{
"name": "{{name}}"
}
""";

通常の文字列、逐語的文字列リテラル、生文字列リテラルを使い分けると、複雑な文字列も読みやすく書けます。

11. C# stringの実践サンプル

ここでは、C#のstringを使った実践的なサンプルを紹介します。

入力チェック、分割、変換、検索など、実際の開発でよく使う処理を見ていきましょう。

11-1. ユーザー名を表示するサンプル

ユーザー名を文字列として受け取り、メッセージを表示するサンプルです。

C#
string userName = "Taro";

string message = $"{userName}さん、こんにちは!";

Console.WriteLine(message);

実行結果は次のとおりです。

C#
Taroさん、こんにちは!

文字列補間を使うと、変数を文章の中に自然に埋め込めます。

C#
string userName = "Hanako";
int point = 150;

string message = $"{userName}さんの現在のポイントは{point}です。";

Console.WriteLine(message);

11-2. 入力値をチェックするサンプル

ユーザー入力が空かどうかをチェックするサンプルです。

C#
string input = "   ";

if (string.IsNullOrWhiteSpace(input))
{
Console.WriteLine("入力してください");
}
else
{
Console.WriteLine($"入力値: {input}");
}

空白だけの入力も未入力として扱えます。

前後の空白を削除してから使う場合は、Trimを使います。

C#
string input = "  Taro  ";

if (!string.IsNullOrWhiteSpace(input))
{
string name = input.Trim();
Console.WriteLine($"{name}さん、ようこそ");
}

11-3. CSV風の文字列を分割するサンプル

カンマ区切りの文字列を分割するサンプルです。

C#
string csv = "apple,banana,orange";

string[] items = csv.Split(',');

foreach (string item in items)
{
Console.WriteLine(item);
}

実行結果は次のとおりです。

C#
apple
banana
orange

分割後に前後の空白を削除したい場合は、Trimを組み合わせます。

C#
string csv = "apple, banana, orange";

string[] items = csv.Split(',');

foreach (string item in items)
{
Console.WriteLine(item.Trim());
}

11-4. 数値と文字列を相互変換するサンプル

数値を文字列に変換する例です。

C#
int price = 1200;

string text = price.ToString();

Console.WriteLine(text);

文字列を数値に変換する例です。

C#
string input = "1200";

if (int.TryParse(input, out int price))
{
Console.WriteLine(price + 300);
}
else
{
Console.WriteLine("数値に変換できません");
}

実行結果は次のとおりです。

C#
1500

ユーザー入力を数値に変換する場合は、ParseよりもTryParseを使うと安全です。

11-5. ファイルパス文字列を扱うサンプル

Windowsのファイルパスを文字列で扱う場合は、逐語的文字列リテラルが便利です。

C#
string path = @"C:\Users\Taro\Documents\sample.txt";

Console.WriteLine(path);

通常の文字列で書く場合は、バックスラッシュをエスケープします。

C#
string path = "C:\\Users\\Taro\\Documents\\sample.txt";

ファイル名の拡張子を判定する例です。

C#
string fileName = "sample.csv";

if (fileName.EndsWith(".csv", StringComparison.OrdinalIgnoreCase))
{
Console.WriteLine("CSVファイルです");
}

11-6. 検索キーワードを含むか判定するサンプル

文字列に検索キーワードが含まれるか判定するサンプルです。

C#
string title = "C# string完全ガイド";
string keyword = "string";

if (title.Contains(keyword, StringComparison.OrdinalIgnoreCase))
{
Console.WriteLine("キーワードが含まれています");
}
else
{
Console.WriteLine("キーワードは含まれていません");
}

大文字・小文字を区別したくない場合は、StringComparison.OrdinalIgnoreCaseを指定します。

複数のキーワードを調べる場合は、配列とループを組み合わせます。

C#
string text = "C# stringの宣言と比較を学びます";
string[] keywords = { "string", "比較", "変換" };

foreach (string keyword in keywords)
{
if (text.Contains(keyword, StringComparison.OrdinalIgnoreCase))
{
Console.WriteLine($"{keyword}が含まれています");
}
}

12. C# stringで初心者がつまずきやすいポイント

C#のstringはよく使う型ですが、初心者がつまずきやすいポイントもあります。

特に、null、比較、数値変換、結合、charとの違い、文字数とバイト数の違いには注意が必要です。

12-1. null参照エラーが発生する

もっとも多いエラーのひとつが、nullの文字列に対してメソッドを呼び出すことです。

C#
string text = null;

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

nullの可能性がある場合は、事前にチェックしましょう。

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

空白だけの入力も弾きたい場合は、IsNullOrWhiteSpaceを使います。

C#
if (!string.IsNullOrWhiteSpace(text))
{
Console.WriteLine(text.Trim());
}

null条件演算子も便利です。

C#
int length = text?.Length ?? 0;

12-2. 文字列比較が期待通りにならない

文字列比較では、大文字・小文字の違いに注意が必要です。

C#
string a = "admin";
string b = "ADMIN";

Console.WriteLine(a == b); // False

大文字・小文字を無視したい場合は、StringComparison.OrdinalIgnoreCaseを使います。

C#
bool result = string.Equals(a, b, StringComparison.OrdinalIgnoreCase);

Console.WriteLine(result); // True

また、文字列の前後に空白が入っていると一致しません。

C#
string input = " admin ";

Console.WriteLine(input == "admin"); // False

必要に応じてTrimを使いましょう。

C#
bool result = string.Equals(input.Trim(), "admin", StringComparison.OrdinalIgnoreCase);

12-3. 数値変換で例外が発生する

文字列を数値に変換するとき、変換できない文字列をParseすると例外が発生します。

C#
string input = "abc";

int number = int.Parse(input); // FormatException

ユーザー入力を扱う場合は、TryParseを使いましょう。

C#
if (int.TryParse(input, out int number))
{
Console.WriteLine(number);
}
else
{
Console.WriteLine("数値ではありません");
}

小数の場合も同様です。

C#
if (double.TryParse(input, out double value))
{
Console.WriteLine(value);
}

外部から来る文字列は、常に正しいとは限らない前提で処理することが重要です。

12-4. 文字列結合でコードが読みにくくなる

+演算子で多くの文字列を結合すると、コードが読みにくくなることがあります。

C#
string message = "名前:" + name + "、年齢:" + age + "、住所:" + address;

このような場合は、文字列補間を使うと読みやすくなります。

C#
string message = $"名前:{name}、年齢:{age}、住所:{address}";

複数行の文字列を組み立てる場合は、StringBuilderも便利です。

C#
StringBuilder sb = new StringBuilder();

sb.AppendLine($"名前:{name}");
sb.AppendLine($"年齢:{age}");
sb.AppendLine($"住所:{address}");

string message = sb.ToString();

読みやすさと処理効率の両方を意識して使い分けましょう。

12-5. charとstringを混同する

charstringは似ていますが、別の型です。

C#
char c = 'A';
string s = "A";

charは1文字だけを表し、シングルクォーテーションで囲みます。

C#
char letter = 'X';

stringは文字列を表し、ダブルクォーテーションで囲みます。

C#
string text = "X";

次のような書き方はエラーになります。

C#
char c = "A";    // エラー
string s = 'A'; // エラー

1文字ずつ処理したい場合は、stringforeachで回すとcharとして取り出せます。

C#
string text = "ABC";

foreach (char c in text)
{
Console.WriteLine(c);
}

12-6. 文字数とバイト数を混同する

Lengthで取得できるのは、基本的には文字列の長さです。

C#
string text = "ABC";

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

しかし、ファイルサイズや通信データ量で重要になるのはバイト数です。

バイト数を取得するには、エンコーディングを使います。

C#
using System.Text;

string text = "こんにちは";

int byteCount = Encoding.UTF8.GetByteCount(text);

Console.WriteLine(byteCount);

日本語はUTF-8では1文字が複数バイトになるため、文字数とバイト数は一致しません。

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

Console.WriteLine(text.Length); // 5
Console.WriteLine(Encoding.UTF8.GetByteCount(text)); // 15

入力文字数制限とデータサイズ制限は別物として考えましょう。

13. C# stringに関するよくある質問

ここでは、C#のstringに関して初心者からよくある質問に回答します。

13-1. C#のstringは参照型ですか?

はい、C#のstringは参照型です。

ただし、通常の参照型とは少し違い、値のように扱える場面が多いです。

C#
string a = "Hello";
string b = "Hello";

Console.WriteLine(a == b); // True

stringは参照型ですが、==演算子では参照先が同じかどうかではなく、文字列の内容を比較します。

また、stringは不変なので、一度作成された文字列の中身は変更されません。

13-2. stringとStringはどちらを使えばいいですか?

基本的にはstringを使えば問題ありません。

C#
string name = "Taro";

stringSystem.Stringの別名で、C#では一般的に使われる表記です。

C#
string text1 = "Hello";
System.String text2 = "Hello";

どちらも同じ型ですが、C#のコードではstringに統一すると読みやすくなります。

静的メソッドも次のようにstringで呼べます。

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

13-3. string.Emptyと空文字はどちらがよいですか?

string.Empty""は、どちらも空文字を表します。

C#
string a = "";
string b = string.Empty;

どちらを使っても大きな違いはありません。

実務では、プロジェクトやチームのコーディング規約に合わせることが大切です。

C#
string name = string.Empty;

意味を明確にしたい場合はstring.Empty、短く書きたい場合は""が使われます。

13-4. stringを安全に数値へ変換するには?

TryParseを使うのが安全です。

C#
string input = "123";

if (int.TryParse(input, out int number))
{
Console.WriteLine($"変換成功: {number}");
}
else
{
Console.WriteLine("数値に変換できません");
}

int.Parseは変換できない場合に例外が発生します。

C#
int number = int.Parse("abc"); // FormatException

ユーザー入力や外部データを扱う場合は、TryParseを使いましょう。

C#
if (double.TryParse(input, out double value))
{
Console.WriteLine(value);
}

13-5. 文字列を1文字ずつ処理するには?

foreachを使うと、文字列を1文字ずつ処理できます。

C#
string text = "ABC";

foreach (char c in text)
{
Console.WriteLine(c);
}

実行結果は次のとおりです。

C#
A
B
C

インデックスを使ってアクセスすることもできます。

C#
string text = "ABC";

Console.WriteLine(text[0]); // A
Console.WriteLine(text[1]); // B
Console.WriteLine(text[2]); // C

ただし、インデックス範囲外にアクセスすると例外になります。

C#
Console.WriteLine(text[3]); // エラー

13-6. 文字列の一部を削除するには?

文字列の一部を削除するには、Removeを使います。

C#
string text = "Hello World";

string result = text.Remove(5);

Console.WriteLine(result);

実行結果は次のとおりです。

C#
Hello

指定した位置から一定文字数を削除することもできます。

C#
string text = "Hello World";

string result = text.Remove(5, 1);

Console.WriteLine(result);

実行結果は次のとおりです。

C#
HelloWorld

特定の文字列を削除したい場合は、Replaceで空文字に置き換える方法もあります。

C#
string text = "2026/06/15";

string result = text.Replace("/", "");

Console.WriteLine(result);

実行結果は次のとおりです。

C#
20260615

13-7. stringとStringBuilderの使い分けは?

短い文字列結合や、数回程度の結合ならstringで問題ありません。

C#
string message = $"{name}さん、こんにちは";

配列やリストを結合する場合は、string.Joinが便利です。

C#
string result = string.Join(", ", names);

一方、ループで大量に文字列を追加する場合は、StringBuilderが向いています。

C#
using System.Text;

StringBuilder sb = new StringBuilder();

for (int i = 0; i < 10000; i++)
{
sb.Append(i);
}

string result = sb.ToString();

目安として、読みやすさを優先できる短い結合はstring、大量の繰り返し結合はStringBuilderと覚えておきましょう。

まとめ

C#のstringは、文字列を扱うための基本的なデータ型です。名前、メッセージ、入力値、ファイルパス、検索キーワードなど、さまざまな場面で使われます。

stringSystem.Stringの別名であり、C#では一般的にstringと書くことが多いです。文字列の宣言や初期化は簡単ですが、null、空文字、空白文字列の違いを理解しておくことが重要です。

文字列の結合には、+演算子、文字列補間、string.Concatstring.JoinStringBuilderなどがあります。短い結合では文字列補間が読みやすく、大量の結合ではStringBuilderが効率的です。

文字列比較では、==Equalsを使えますが、実務ではStringComparison.OrdinalStringComparison.OrdinalIgnoreCaseを指定すると、意図が明確で安全なコードになります。

また、数値や日付との変換では、ToStringParseTryParseConvert.ToStringを使い分けます。特にユーザー入力を数値に変換する場合は、例外を防ぐためにTryParseを使うのがおすすめです。

C#のstringを正しく理解すると、入力チェック、検索、置換、分割、整形、ファイルパス処理など、実践的なプログラムが書きやすくなります。まずは基本的な宣言、結合、比較、変換、よく使うメソッドから覚え、少しずつStringBuilderやエスケープ文字、生文字列リテラルなども使いこなしていきましょう。