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";
この文字列は、内部的にはA、B、Cという文字が並んでいるイメージです。
ただし、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 = "こんにちは";
この場合、右辺が文字列リテラルなので、messageはstring型として扱われます。
次のコードと同じ意味です。
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#では、stringとStringの両方を見かけることがあります。
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.Concat、string.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に変換したり、逆にstringをintやdoubleに変換したりする場面がよくあります。
文字列変換は、入力処理、画面表示、ファイル読み書き、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();
doubleやDateTimeなどでも使えます。
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に変換するには、DateTimeのToStringを使います。
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;
これは「文字列が存在しない」状態です。
そのため、LengthやContainsなどを呼び出すと例外が発生します。
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を混同する
charとstringは似ていますが、別の型です。
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文字ずつ処理したい場合は、stringをforeachで回すと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";
stringはSystem.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は、文字列を扱うための基本的なデータ型です。名前、メッセージ、入力値、ファイルパス、検索キーワードなど、さまざまな場面で使われます。
stringはSystem.Stringの別名であり、C#では一般的にstringと書くことが多いです。文字列の宣言や初期化は簡単ですが、null、空文字、空白文字列の違いを理解しておくことが重要です。
文字列の結合には、+演算子、文字列補間、string.Concat、string.Join、StringBuilderなどがあります。短い結合では文字列補間が読みやすく、大量の結合ではStringBuilderが効率的です。
文字列比較では、==やEqualsを使えますが、実務ではStringComparison.OrdinalやStringComparison.OrdinalIgnoreCaseを指定すると、意図が明確で安全なコードになります。
また、数値や日付との変換では、ToString、Parse、TryParse、Convert.ToStringを使い分けます。特にユーザー入力を数値に変換する場合は、例外を防ぐためにTryParseを使うのがおすすめです。
C#のstringを正しく理解すると、入力チェック、検索、置換、分割、整形、ファイルパス処理など、実践的なプログラムが書きやすくなります。まずは基本的な宣言、結合、比較、変換、よく使うメソッドから覚え、少しずつStringBuilderやエスケープ文字、生文字列リテラルなども使いこなしていきましょう。

