C#のcharとstringの違い・変換・使い分けを初心者向けに徹底解説
はじめに
C#で文字を扱うときによく登場するのが、charとstringです。どちらも「文字」に関係するデータ型ですが、役割は大きく異なります。
簡単にいうと、charは1文字を扱う型、stringは複数の文字をまとめて扱う型です。
たとえば、アルファベットの'A'や数字の'1'のように1文字だけを扱うならcharを使います。一方、"Hello"や"山田太郎"のように文字が並んだデータを扱うならstringを使います。
C#を学び始めたばかりの初心者は、charとstringの違いや、シングルクォートとダブルクォートの使い分けでつまずきやすいです。また、charからstringへ変換したい場合や、stringから1文字だけ取り出してcharとして扱いたい場面もよくあります。
この記事では、C#のcharとstringの違い、宣言方法、変換方法、使い分け、よくあるエラーまで、初心者にもわかりやすく解説します。
1. C#のcharとstringの基本を初心者向けに整理
C#で文字データを扱うときは、まずcharとstringの基本を理解することが大切です。
どちらも文字に関係する型ですが、charは「1文字」、stringは「文字列」を扱います。この違いを理解しておくと、コードを書いたときのエラーを減らせます。
1-1. charとは1文字を扱うデータ型
charは、C#で1文字を扱うためのデータ型です。
たとえば、次のような1文字をcharとして扱えます。
C#char grade = 'A';
char number = '1';
char symbol = '!';
char japanese = 'あ';
charの値は、シングルクォート'で囲みます。
C#char letter = 'C';
ここで重要なのは、charには基本的に1文字しか入れられないという点です。
次のように複数の文字を入れようとするとエラーになります。
C#char text = 'AB'; // エラー
charは、1文字単位で判定したいときや、文字列の中から1文字だけ取り出して処理したいときに使われます。
1-2. stringとは複数の文字を扱う文字列型
stringは、C#で文字列を扱うためのデータ型です。
文字列とは、複数の文字が並んだデータのことです。
C#string name = "Taro";
string message = "Hello, C#";
string japanese = "こんにちは";
stringの値は、ダブルクォート"で囲みます。
C#string text = "ABC";
stringには、複数文字だけでなく、1文字だけの文字列も入れられます。
C#string letter = "A";
この場合、見た目は1文字ですが、型としてはcharではなくstringです。
また、何も文字が入っていない空文字もstringで表現できます。
C#string empty = "";
stringは、名前、住所、メールアドレス、文章、メッセージなど、実際のアプリケーションで非常によく使われる型です。
1-3. charとstringの違いを表で比較
charとstringの違いを表で整理すると、次のようになります。
| 項目 | char | string |
|---|---|---|
| 扱う内容 | 1文字 | 文字列 |
| 囲み方 | シングルクォート' | ダブルクォート" |
| 例 | 'A' | "A"、"Hello" |
| 空の値 | 基本的に空文字は不可 | ""で空文字を表せる |
| 主な用途 | 1文字の判定・処理 | 名前や文章などの文字列処理 |
| 型名 | char | string |
たとえば、'A'と"A"は見た目が似ていますが、C#では別の型として扱われます。
C#char c = 'A';
string s = "A";
'A'はchar、"A"はstringです。
この違いは初心者が特に間違えやすいポイントなので、必ず覚えておきましょう。
1-4. シングルクォートとダブルクォートの使い分け
C#では、charにはシングルクォート'、stringにはダブルクォート"を使います。
C#char c = 'A';
string s = "A";
次のように書くとエラーになります。
C#char c = "A"; // エラー
string s = 'A'; // エラー
"A"は1文字だけに見えますが、ダブルクォートで囲まれているためstringです。
一方、'A'はシングルクォートで囲まれているためcharです。
また、charに複数文字を入れることもできません。
C#char c = 'ABC'; // エラー
C#で文字を扱うときは、まず「これは1文字なのか、文字列なのか」を考え、そのうえでクォートを使い分けることが大切です。
2. charとstringの宣言・代入の書き方
ここでは、C#でcharとstringを宣言して値を代入する基本的な書き方を解説します。
宣言とは、変数を用意することです。代入とは、その変数に値を入れることです。
2-1. charの宣言方法とサンプルコード
charの宣言は、次のように書きます。
C#char 変数名 = '文字';
具体例を見てみましょう。
C#char firstLetter = 'A';
Console.WriteLine(firstLetter);
実行結果は次のようになります。
C#A
数字のように見える文字も、シングルクォートで囲めばcharとして扱えます。
C#char numberChar = '5';
Console.WriteLine(numberChar);
この'5'は数値の5ではなく、文字としての5です。
記号もcharに入れられます。
C#char mark = '?';
Console.WriteLine(mark);
日本語の1文字もcharに入れられます。
C#char hiragana = 'あ';
Console.WriteLine(hiragana);
ただし、絵文字など一部の文字は内部的に複数のcharとして扱われる場合があります。初心者のうちは、通常のアルファベット、数字、ひらがな、カタカナ、漢字の1文字を扱うものと考えると理解しやすいです。
2-2. stringの宣言方法とサンプルコード
stringの宣言は、次のように書きます。
C#string 変数名 = "文字列";
具体例です。
C#string message = "Hello";
Console.WriteLine(message);
実行結果は次のようになります。
C#Hello
日本語の文字列も扱えます。
C#string greeting = "こんにちは";
Console.WriteLine(greeting);
名前を入れる場合もstringを使います。
C#string name = "山田太郎";
Console.WriteLine(name);
文章のように長い文字列もstringで扱います。
C#string text = "C#のcharとstringを勉強しています。";
Console.WriteLine(text);
stringは、C#で最もよく使う型のひとつです。画面に表示するメッセージ、ユーザーが入力した文字、ファイルの内容など、さまざまな場面で使われます。
2-3. charに複数文字を入れたときのエラー
charは1文字だけを扱う型なので、複数文字を入れることはできません。
C#char value = 'AB';
このように書くと、コンパイルエラーになります。
C#では、シングルクォート'で囲めるのは基本的に1文字だけです。複数文字を扱いたい場合は、stringを使います。
C#string value = "AB";
また、次のように空のシングルクォートを書くこともできません。
C#char value = ''; // エラー
charには「何もない文字」を直接入れることはできません。空の文字列を表したい場合は、stringで空文字を使います。
C#string empty = "";
charは必ず1文字を入れる型、stringは0文字以上の文字列を扱える型と覚えておくとよいでしょう。
2-4. stringに1文字だけ入れる場合の考え方
stringには、1文字だけを入れることもできます。
C#string letter = "A";
この場合、文字数は1文字ですが、型はstringです。
一方、次のように書くとcharです。
C#char letter = 'A';
初心者が迷いやすいのは、「1文字なら必ずcharにすべきなのか」という点です。
結論としては、1文字であっても、文字列として扱いたいならstringで問題ありません。
たとえば、名前の頭文字を文字列として表示したい場合や、他の文字列と結合したい場合はstringでも自然です。
C#string initial = "A";
string message = initial + "さん、こんにちは";
Console.WriteLine(message);
一方で、1文字だけを判定したい場合はcharが向いています。
C#char input = 'y';
if (input == 'y')
{
Console.WriteLine("はいが選択されました");
}
つまり、文字の数だけでなく、どのように使うかでcharとstringを選ぶことが大切です。
3. charとstringを変換する方法
C#では、charとstringを変換したい場面がよくあります。
たとえば、charを文字列として結合したい場合や、stringから1文字だけ取り出してcharとして判定したい場合です。
ここでは、charからstring、stringからcharへの変換方法を解説します。
3-1. charからstringへ変換する方法
charからstringへ変換する代表的な方法は、ToString()を使う方法です。
C#char c = 'A';
string s = c.ToString();
Console.WriteLine(s);
実行結果は次のようになります。
C#A
charの'A'が、stringの"A"に変換されます。
また、stringのコンストラクターを使って変換することもできます。
C#char c = 'B';
string s = new string(c, 1);
Console.WriteLine(s);
実行結果は次のようになります。
C#B
ただし、1文字のcharをstringに変換するだけなら、ToString()を使う方法がわかりやすく一般的です。
3-2. stringからcharへ変換する方法
stringからcharへ変換する場合は、文字列の長さに注意が必要です。
charは1文字しか扱えないため、stringが1文字の場合だけ自然に変換できます。
代表的な方法は、インデックスを使って文字列の1文字目を取り出す方法です。
C#string s = "A";
char c = s[0];
Console.WriteLine(c);
実行結果は次のようになります。
C#A
stringは複数の文字が並んだものなので、s[0]のように書くと先頭の1文字をcharとして取得できます。
ただし、文字列が空の場合はエラーになります。
C#string s = "";
char c = s[0]; // エラー
そのため、実際のコードでは文字列の長さを確認してから取り出すのが安全です。
C#string s = "A";
if (s.Length > 0)
{
char c = s[0];
Console.WriteLine(c);
}
3-3. ToString()を使った変換
ToString()は、値を文字列に変換するためによく使われるメソッドです。
charにもToString()が使えます。
C#char c = 'X';
string s = c.ToString();
Console.WriteLine(s);
このコードでは、char型のcをstring型のsに変換しています。
文字列結合をしたい場合にも便利です。
C#char mark = '!';
string message = "Hello" + mark.ToString();
Console.WriteLine(message);
実行結果は次のようになります。
C#Hello!
なお、C#では文字列とcharを+で結合すると、自動的に文字列として扱われる場合もあります。
C#char mark = '!';
string message = "Hello" + mark;
Console.WriteLine(message);
この場合も実行結果は次のようになります。
C#Hello!
ただし、型を明確にしたい場合や初心者が学習する段階では、ToString()を使うと「文字列に変換している」ことがわかりやすくなります。
3-4. 文字列のインデックス指定でcharを取り出す方法
stringからcharを取り出すには、インデックスを使います。
インデックスとは、文字列の中で何番目の文字かを表す番号です。
C#のインデックスは0から始まります。
C#string text = "ABC";
char first = text[0];
char second = text[1];
char third = text[2];
Console.WriteLine(first);
Console.WriteLine(second);
Console.WriteLine(third);
実行結果は次のようになります。
C#A
B
C
text[0]は1文字目、text[1]は2文字目、text[2]は3文字目です。
初心者が間違えやすいのは、1文字目をtext[1]と書いてしまうことです。
C#string text = "ABC";
char c = text[1];
Console.WriteLine(c);
この場合、出力されるのはAではなくBです。
インデックスは0から始まることを覚えておきましょう。
3-5. 空文字や複数文字を変換するときの注意点
stringからcharへ変換するときは、文字列の長さに注意する必要があります。
空文字の場合、取り出せる文字がありません。
C#string text = "";
char c = text[0]; // エラー
このようなコードは、インデックス範囲外エラーの原因になります。
安全に処理するには、Lengthを使って文字数を確認します。
C#string text = "";
if (text.Length > 0)
{
char c = text[0];
Console.WriteLine(c);
}
else
{
Console.WriteLine("文字がありません");
}
また、複数文字のstringをそのままcharに変換することはできません。
C#string text = "ABC";
char c = text; // エラー
複数文字の中から1文字だけ取り出したい場合は、インデックスを指定します。
C#string text = "ABC";
char c = text[0];
Console.WriteLine(c);
実行結果は次のようになります。
C#A
stringからcharへ変換するというよりも、stringの中から1文字を取り出すと考えると理解しやすいです。
4. string内の文字をcharとして扱う方法
C#のstringは、文字が順番に並んだものとして扱えます。そのため、文字列の中にある1文字をcharとして取得できます。
ここでは、インデックスやforeachを使って、string内の文字を1文字ずつ扱う方法を解説します。
4-1. stringは文字の集合として扱える
stringは、複数のcharが並んだものとして考えることができます。
たとえば、次の文字列を見てみましょう。
C#string text = "CSharp";
この文字列は、次のような文字の集まりとして扱えます。
C#C
S
h
a
r
p
C#では、stringに対してインデックスを指定すると、その位置にある文字をcharとして取得できます。
C#string text = "CSharp";
char c = text[0];
Console.WriteLine(c);
実行結果は次のようになります。
C#C
このように、stringは文字列全体を扱うだけでなく、1文字ずつ取り出して処理することもできます。
4-2. インデックスを使って1文字ずつ取得する
stringの各文字を取得するには、インデックスを使います。
C#string text = "ABC";
Console.WriteLine(text[0]);
Console.WriteLine(text[1]);
Console.WriteLine(text[2]);
実行結果は次のようになります。
C#A
B
C
インデックスは0から始まるため、3文字の文字列で使えるインデックスは0、1、2です。
次のように3を指定するとエラーになります。
C#string text = "ABC";
Console.WriteLine(text[3]); // エラー
text[3]は4文字目を意味します。しかし、"ABC"には4文字目がないため、インデックス範囲外エラーになります。
安全に最後の文字を取得したい場合は、Lengthを使います。
C#string text = "ABC";
char last = text[text.Length - 1];
Console.WriteLine(last);
実行結果は次のようになります。
C#C
Lengthは文字数を表すため、最後のインデックスはLength - 1になります。
4-3. foreachで文字列を1文字ずつ処理する
文字列を1文字ずつ処理したい場合は、foreachを使うと便利です。
C#string text = "Hello";
foreach (char c in text)
{
Console.WriteLine(c);
}
実行結果は次のようになります。
C#H
e
l
l
o
foreachを使うと、インデックスを意識せずに文字列の先頭から順番に1文字ずつ取得できます。
たとえば、文字列の中に数字が含まれているかを調べることもできます。
C#string text = "abc123";
foreach (char c in text)
{
if (char.IsDigit(c))
{
Console.WriteLine(c + " は数字です");
}
}
実行結果は次のようになります。
C#1 は数字です
2 は数字です
3 は数字です
文字列全体を順番に調べたい場合は、foreachがとても使いやすいです。
4-4. Lengthプロパティで文字数を確認する
stringの文字数を確認するには、Lengthプロパティを使います。
C#string text = "Hello";
Console.WriteLine(text.Length);
実行結果は次のようになります。
C#5
Lengthは、文字列に含まれる文字数を返します。
空文字の場合は0になります。
C#string text = "";
Console.WriteLine(text.Length);
実行結果は次のようになります。
C#0
Lengthは、インデックスを使って文字を取り出す前のチェックにもよく使います。
C#string text = "C#";
if (text.Length > 0)
{
Console.WriteLine(text[0]);
}
このように書けば、空文字に対してtext[0]を実行してエラーになることを防げます。
5. charとstringの使い分け方
charとstringの違いを理解したら、次に大切なのは使い分けです。
基本的には、1文字だけを文字として判定・比較したいならchar、文字列として扱いたいならstringを使います。
5-1. charを使うべき場面
charは、1文字単位で処理したい場合に向いています。
たとえば、次のような場面です。
C#char answer = 'y';
if (answer == 'y')
{
Console.WriteLine("Yesが選択されました");
}
このように、ユーザーの入力がyかnかを判定するような場合は、charが使いやすいです。
また、文字が数字かどうか、英字かどうかを判定する場合にもcharを使います。
C#char c = '5';
if (char.IsDigit(c))
{
Console.WriteLine("数字です");
}
文字列の中から1文字ずつ取り出して処理する場合にもcharが使われます。
C#string text = "abc123";
foreach (char c in text)
{
Console.WriteLine(c);
}
charは、文字列全体ではなく、1文字そのものに注目したいときに使う型です。
5-2. stringを使うべき場面
stringは、文字列全体を扱いたい場合に使います。
たとえば、次のようなデータはstringで扱うのが自然です。
C#string name = "佐藤花子";
string address = "東京都新宿区";
string email = "sample@example.com";
string message = "こんにちは、C#を学習中です。";
名前や住所、メールアドレス、文章などは、1文字ではなく複数の文字の集まりです。そのため、stringを使います。
文字列を検索したり、置換したり、分割したりする場合もstringを使います。
C#string text = "C#のstringを学習しています";
if (text.Contains("string"))
{
Console.WriteLine("stringが含まれています");
}
文字列全体に対する操作をしたい場合は、stringを使うと覚えておきましょう。
5-3. 1文字の入力判定でcharを使う例
ユーザーの入力が1文字だけの場合、charを使うと判定しやすくなります。
C#Console.WriteLine("続けますか? y/n");
string input = Console.ReadLine();
if (input.Length > 0)
{
char answer = input[0];
if (answer == 'y')
{
Console.WriteLine("処理を続けます");
}
else if (answer == 'n')
{
Console.WriteLine("処理を終了します");
}
else
{
Console.WriteLine("yまたはnを入力してください");
}
}
Console.ReadLine()の戻り値はstringです。そのため、入力された文字列からinput[0]で先頭の1文字を取り出し、charとして扱っています。
このように、入力自体はstringで受け取り、必要に応じてcharを取り出すという書き方はよく使われます。
5-4. 名前や文章などの文字列でstringを使う例
名前や文章を扱う場合は、stringを使います。
C#Console.WriteLine("名前を入力してください");
string name = Console.ReadLine();
Console.WriteLine("こんにちは、" + name + "さん");
実行例は次のようになります。
C#名前を入力してください
太郎
こんにちは、太郎さん
文章を扱う場合もstringです。
C#string message = "C#のcharとstringの違いを学習しています。";
Console.WriteLine(message);
stringは文字列全体をそのまま表示したり、結合したり、検索したりできるため、実用的なプログラムで非常によく使われます。
5-5. 初心者が迷いやすい使い分けの判断基準
charとstringの使い分けで迷ったときは、次のように考えると判断しやすくなります。
| 判断ポイント | 使う型 |
|---|---|
| 1文字だけを比較したい | char |
| 1文字ずつループ処理したい | char |
| 名前や文章を扱いたい | string |
| 文字列を検索・置換・分割したい | string |
| 空文字を扱う可能性がある | string |
| ユーザー入力を受け取る | 基本はstring |
特に初心者は、「1文字なら必ずchar」と考えがちですが、必ずしもそうではありません。
たとえば、画面に表示するラベルやコード値として扱うなら、1文字でもstringのほうが扱いやすい場合があります。
C#string rank = "A";
string message = "ランクは" + rank + "です";
一方、文字そのものを判定するならcharが向いています。
C#char rank = 'A';
if (rank == 'A')
{
Console.WriteLine("最高ランクです");
}
迷ったときは、「文字そのものを1文字として扱うのか」「文字列として扱うのか」を基準にしましょう。
6. charとstringでよく使うメソッド・機能
C#のcharとstringには、便利なメソッドや機能が用意されています。
ここでは、初心者がよく使うものを中心に紹介します。
6-1. char.IsDigitで数字か判定する
char.IsDigitを使うと、指定した文字が数字かどうかを判定できます。
C#char c = '7';
if (char.IsDigit(c))
{
Console.WriteLine("数字です");
}
else
{
Console.WriteLine("数字ではありません");
}
実行結果は次のようになります。
C#数字です
文字列の中から数字だけを探す場合にも使えます。
C#string text = "abc123";
foreach (char c in text)
{
if (char.IsDigit(c))
{
Console.WriteLine(c);
}
}
実行結果は次のようになります。
C#1
2
3
入力値のチェックや、文字列から数字だけを取り出す処理でよく使われます。
6-2. char.IsLetterで英字か判定する
char.IsLetterを使うと、指定した文字が文字かどうかを判定できます。
C#char c = 'A';
if (char.IsLetter(c))
{
Console.WriteLine("文字です");
}
else
{
Console.WriteLine("文字ではありません");
}
実行結果は次のようになります。
C#文字です
数字の場合は、文字ではないと判定されます。
C#char c = '1';
if (char.IsLetter(c))
{
Console.WriteLine("文字です");
}
else
{
Console.WriteLine("文字ではありません");
}
実行結果は次のようになります。
C#文字ではありません
なお、char.IsLetterは英字だけでなく、日本語のひらがなや漢字なども文字として判定されます。
C#char c = 'あ';
Console.WriteLine(char.IsLetter(c));
実行結果は次のようになります。
C#True
英字だけを判定したい場合は、'A'から'Z'、'a'から'z'の範囲を自分で確認する方法もあります。
C#char c = 'A';
if ((c >= 'A' && c <= 'Z') || (c >= 'a' && c <= 'z'))
{
Console.WriteLine("英字です");
}
6-3. string.Containsで文字列を含むか調べる
string.Containsを使うと、文字列の中に指定した文字列が含まれているかを調べられます。
C#string text = "C#のstringを学習しています";
if (text.Contains("string"))
{
Console.WriteLine("stringが含まれています");
}
実行結果は次のようになります。
C#stringが含まれています
1文字だけを探す場合にも使えます。
C#string text = "Hello";
if (text.Contains("H"))
{
Console.WriteLine("Hが含まれています");
}
Containsは戻り値がboolです。含まれていればtrue、含まれていなければfalseになります。
C#string text = "Hello";
Console.WriteLine(text.Contains("e"));
Console.WriteLine(text.Contains("z"));
実行結果は次のようになります。
C#True
False
文字列検索をしたいときに、とてもよく使うメソッドです。
6-4. string.Replaceで文字列を置換する
string.Replaceを使うと、文字列の一部を別の文字列に置き換えられます。
C#string text = "I like Java";
string result = text.Replace("Java", "C#");
Console.WriteLine(result);
実行結果は次のようになります。
C#I like C#
1文字の置換にも使えます。
C#string text = "apple";
string result = text.Replace("p", "P");
Console.WriteLine(result);
実行結果は次のようになります。
C#aPPle
Replaceは元の文字列を直接変更するのではなく、置換後の新しい文字列を返します。
C#string text = "abc";
text.Replace("a", "A");
Console.WriteLine(text);
実行結果は次のようになります。
C#abc
置換後の結果を使いたい場合は、戻り値を変数に代入する必要があります。
C#string text = "abc";
text = text.Replace("a", "A");
Console.WriteLine(text);
実行結果は次のようになります。
C#Abc
6-5. string.Splitで文字列を分割する
string.Splitを使うと、文字列を指定した区切り文字で分割できます。
C#string text = "apple,banana,orange";
string[] fruits

