C#のcharとは?文字型の基本・変換・比較・使い方を初心者向けに徹底解説

はじめに

C#で文字を扱うときに登場する基本的なデータ型がcharです。charは「キャラクター」と読み、1つの文字を表すために使います。

たとえば、アルファベットの'A'、数字の'1'、記号の'!'、日本語の'あ'などは、C#ではcharとして扱えます。

C#
char letter = 'A';
char number = '1';
char symbol = '!';
char japanese = 'あ';

一見するとstringと似ていますが、charは「1文字」、stringは「文字列」を扱う型です。この違いを理解しておくと、文字列処理、入力チェック、文字の比較、変換処理などがスムーズに書けるようになります。

この記事では、C#のcharについて、基本的な使い方から変換、比較、便利な判定メソッド、実践的な活用例、よくあるエラーまで初心者向けに詳しく解説します。

1. C#のcharとは?文字型の基本を初心者向けに解説

C#のcharは、1つの文字を格納するためのデータ型です。文字を1文字だけ扱いたいときに使います。

文字列全体を扱う場合はstringを使いますが、文字列の中から1文字だけ取り出したり、入力された文字が数字か英字かを判定したりする場面ではcharがよく使われます。

1-1. charは「1文字」を扱うためのデータ型

charは1文字だけを扱う型です。複数の文字を入れることはできません。

C#
char c = 'A';
Console.WriteLine(c);

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

C#
A

charには'A'のように、1つの文字を代入します。

次のように2文字以上を代入するとエラーになります。

C#
char c = 'AB'; // エラー

charは、名前、文章、単語のような複数文字ではなく、あくまで「1文字」を扱うための型です。

1-2. charで扱える文字の例:英字・数字・記号・日本語

C#のcharでは、英字だけでなく、数字、記号、日本語なども扱えます。

C#
char a = 'A';
char b = 'z';
char c = '5';
char d = '#';
char e = 'あ';
char f = '漢';

Console.WriteLine(a);
Console.WriteLine(b);
Console.WriteLine(c);
Console.WriteLine(d);
Console.WriteLine(e);
Console.WriteLine(f);

'5'のような数字もcharに入れられます。ただし、これは数値の5ではなく、文字としての'5'です。

C#
char ch = '5';
int num = 5;

この2つは見た目は似ていますが、意味は異なります。char ch = '5';は文字、int num = 5;は数値です。

1-3. charはシングルクォーテーションで囲む

C#でcharを表すときは、シングルクォーテーション'で囲みます。

C#
char c = 'A';

一方、ダブルクォーテーション"で囲むとstringになります。

C#
string s = "A";

'A'char"A"stringです。どちらも画面にはAと表示されますが、データ型が違います。

次のコードはエラーになります。

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

charに代入する文字は、必ずシングルクォーテーションで囲みます。

1-4. charとstringの違い

charstringの最大の違いは、扱える文字数です。

charは1文字だけを扱います。

C#
char c = 'A';

stringは0文字以上の文字列を扱います。

C#
string s1 = "A";
string s2 = "Hello";
string s3 = "";

stringは空文字""も扱えますが、charには空文字を代入できません。

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

また、stringは複数のcharが並んだものとして考えることができます。

C#
string text = "ABC";

char first = text[0]; // 'A'
char second = text[1]; // 'B'
char third = text[2]; // 'C'

文字列の中から1文字ずつ取り出すと、その結果はcharになります。

2. C#でcharを宣言・代入する基本構文

C#でcharを使うには、変数を宣言して文字を代入します。基本構文はとてもシンプルです。

C#
char 変数名 = '文字';

たとえば、次のように書きます。

C#
char grade = 'A';

2-1. char変数の宣言方法

char変数を宣言するには、型名charのあとに変数名を書きます。

C#
char c;

この時点では、ローカル変数の場合、まだ値が代入されていないため、そのまま使うことはできません。

C#
char c;
Console.WriteLine(c); // エラー

使用する前に値を代入する必要があります。

C#
char c;
c = 'A';

Console.WriteLine(c);

変数の宣言と代入を同時に行うこともできます。

C#
char c = 'A';

通常は、宣言と同時に初期値を入れておくとわかりやすいです。

2-2. charに文字を代入する方法

charに文字を代入するときは、シングルクォーテーションで1文字を囲みます。

C#
char letter = 'B';
char digit = '8';
char mark = '?';
char kana = 'か';

あとから別の文字を代入することもできます。

C#
char c = 'A';
c = 'B';

Console.WriteLine(c);

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

C#
B

charは変数なので、再代入すれば中身を変更できます。

2-3. charの初期値とdefault(char)

charの既定値は'\0'です。これはヌル文字と呼ばれる特殊な文字です。

C#
char c = default(char);

Console.WriteLine((int)c);

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

C#
0

default(char)は文字コードが0の文字を表します。

C#
char c = '\0';

'\0'は空文字ではありません。char型の値として存在する「ヌル文字」です。

空文字""stringで使うもので、charには代入できません。

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

2-4. charでよくあるコンパイルエラー

charでよくあるエラーの1つは、複数文字を代入してしまうことです。

C#
char c = 'AB'; // エラー

charには1文字しか代入できません。

また、ダブルクォーテーションを使ってしまうエラーもよくあります。

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

"A"stringなので、charにはそのまま代入できません。

空文字を代入しようとするのもエラーです。

C#
char c = ''; // エラー

charを使うときは、次の3点を意識しましょう。

C#
char c1 = 'A';  // OK
char c2 = 'あ'; // OK
char c3 = '1'; // OK

charはシングルクォーテーションで囲んだ1文字だけを扱います。

3. charとUnicodeの関係

C#のcharを理解するうえで大切なのが、Unicodeとの関係です。C#のcharは単なる見た目の文字ではなく、内部的には文字コードを持っています。

3-1. C#のcharはUnicode文字を表す

C#のcharは、Unicode文字を表す型です。Unicodeとは、世界中の文字を統一的に扱うための文字コード体系です。

英字、数字、記号、日本語、ギリシャ文字、キリル文字など、さまざまな文字を表すことができます。

C#
char a = 'A';
char hiragana = 'あ';
char kanji = '漢';

Console.WriteLine(a);
Console.WriteLine(hiragana);
Console.WriteLine(kanji);

C#では日本語の文字もcharとして扱えます。

C#
char c = '日';
Console.WriteLine(c);

ただし、すべての見た目上の1文字が必ず1つのcharで表せるわけではありません。特に絵文字などでは注意が必要です。

3-2. charの内部的な数値コード

charは内部的には数値コードを持っています。charintに変換すると、その文字に対応するUnicodeコード値を確認できます。

C#
char c = 'A';
int code = c;

Console.WriteLine(code);

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

C#
65

'A'の文字コードは65です。

日本語の文字も数値コードとして扱えます。

C#
char c = 'あ';
int code = c;

Console.WriteLine(code);

charは見た目には文字ですが、内部的には文字コードに基づいて処理されます。そのため、比較や並び替えでは文字コード順が関係することがあります。

3-3. 日本語や絵文字を扱うときの注意点

日本語のひらがなや漢字の多くは、charで1文字として扱えます。

C#
char c1 = 'あ';
char c2 = '漢';

しかし、絵文字のように、見た目は1文字でも複数のcharで表される文字があります。

C#
string emoji = "😀";

Console.WriteLine(emoji.Length);

この場合、環境や文字によっては、見た目は1文字でもLength2になることがあります。これは、絵文字がサロゲートペアと呼ばれる仕組みで表されるためです。

C#
string emoji = "😀";

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

このように処理すると、絵文字が2つのcharに分かれて扱われることがあります。

そのため、絵文字を「見た目の1文字」として正確に扱いたい場合は、charだけでなく、System.Text.Runeなどの利用も検討します。

初心者のうちは、charは基本的に「英字、数字、記号、日本語などの1文字を扱う型」と覚えておき、絵文字では注意が必要だと理解しておくとよいでしょう。

3-4. エスケープ文字の使い方

charでは、通常の文字だけでなく、エスケープ文字も扱えます。エスケープ文字とは、改行やタブなど、特殊な意味を持つ文字を表す書き方です。

代表的なエスケープ文字には次のようなものがあります。

C#
char newline = '\n'; // 改行
char tab = '\t'; // タブ
char quote = '\''; // シングルクォーテーション
char backslash = '\\'; // バックスラッシュ
char nullChar = '\0'; // ヌル文字

たとえば、改行文字を使うと次のようになります。

C#
Console.WriteLine("Hello\nWorld");

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

C#
Hello
World

シングルクォーテーション自体をcharとして扱いたい場合は、次のように書きます。

C#
char quote = '\'';
Console.WriteLine(quote);

バックスラッシュを扱う場合は、'\\'と書きます。

C#
char slash = '\\';
Console.WriteLine(slash);

4. charとstringの変換方法

C#では、charstringを相互に変換する場面がよくあります。たとえば、1文字を文字列として連結したい場合や、文字列から1文字を取り出したい場合です。

4-1. charからstringへ変換する方法

charからstringへ変換するには、いくつかの方法があります。

もっとも一般的なのは、ToStringメソッドを使う方法です。

C#
char c = 'A';
string s = c.ToString();

Console.WriteLine(s);

また、new stringを使って変換することもできます。

C#
char c = 'A';
string s = new string(c, 1);

Console.WriteLine(s);

文字列と連結すると、自動的にstringとして扱われます。

C#
char c = 'A';
string s = "文字は" + c;

Console.WriteLine(s);

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

C#
文字はA

4-2. stringからcharを取り出す方法

stringからcharを取り出すには、インデックスを使います。

C#
string text = "ABC";

char c = text[0];

Console.WriteLine(c);

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

C#
A

C#のインデックスは0から始まります。

C#
string text = "ABC";

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

文字列の長さを超えるインデックスを指定するとエラーになります。

C#
string text = "ABC";
char c = text[3]; // エラー

"ABC"の有効なインデックスは012です。3は範囲外です。

安全に取り出すには、文字列の長さを確認します。

C#
string text = "ABC";

if (text.Length > 0)
{
char first = text[0];
Console.WriteLine(first);
}

4-3. ToStringメソッドを使った変換

charにはToStringメソッドがあります。これを使うと、charstringに変換できます。

C#
char c = 'Z';
string s = c.ToString();

Console.WriteLine(s);

ToStringは、文字列として扱いたいときに便利です。

C#
char initial = 'T';
string message = "先頭文字は " + initial.ToString() + " です。";

Console.WriteLine(message);

ただし、文字列連結ではToStringを書かなくても自動的に変換されることがあります。

C#
char c = 'A';
string s = "値: " + c;

明示的に変換したい場合はToStringを使うと、コードの意図がわかりやすくなります。

4-4. char配列とstringの相互変換

charの配列とstringは相互に変換できます。

文字列をchar配列に変換するには、ToCharArrayを使います。

C#
string text = "Hello";
char[] chars = text.ToCharArray();

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

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

C#
H
e
l
l
o

逆に、char配列からstringを作るには、new stringを使います。

C#
char[] chars = { 'H', 'e', 'l', 'l', 'o' };
string text = new string(chars);

Console.WriteLine(text);

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

C#
Hello

文字列を1文字ずつ加工したい場合は、char配列に変換して処理することがあります。

C#
string text = "abc";
char[] chars = text.ToCharArray();

chars[0] = 'A';

string result = new string(chars);
Console.WriteLine(result);

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

C#
Abc

5. charと数値の変換方法

charは内部的には文字コードを持っているため、数値との変換ができます。ただし、「文字コードとして変換する」のか、「数字文字を数値として変換する」のかを区別することが大切です。

5-1. charをintに変換する方法

charintに変換すると、その文字のUnicodeコード値を取得できます。

C#
char c = 'A';
int code = c;

Console.WriteLine(code);

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

C#
65

明示的にキャストしても同じです。

C#
char c = 'A';
int code = (int)c;

Console.WriteLine(code);

数字文字の場合も、数値そのものではなく文字コードになります。

C#
char c = '1';
int code = (int)c;

Console.WriteLine(code);

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

C#
49

'1'intに変換すると1ではなく、文字コードの49になります。

5-2. intからcharに変換する方法

intからcharに変換するには、キャストを使います。

C#
int code = 65;
char c = (char)code;

Console.WriteLine(c);

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

C#
A

文字コード65'A'に対応しています。

C#
int code = 12354;
char c = (char)code;

Console.WriteLine(c);

このように、Unicodeコード値から文字を作ることができます。

ただし、すべての数値が通常の表示可能な文字に対応しているわけではありません。制御文字や表示できない文字になる場合もあります。

5-3. 数字文字を数値に変換する方法

数字文字'0'から'9'を数値に変換したい場合は、文字コードではなく数値として変換する必要があります。

たとえば、次のコードは期待通りにはなりません。

C#
char c = '5';
int number = (int)c;

Console.WriteLine(number);

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

C#
53

これは'5'の文字コードです。

数字としての5に変換したい場合は、次のように書きます。

C#
char c = '5';
int number = c - '0';

Console.WriteLine(number);

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

C#
5

また、char.GetNumericValueを使う方法もあります。

C#
char c = '5';
double number = char.GetNumericValue(c);

Console.WriteLine(number);

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

C#
5

char.GetNumericValueは戻り値がdoubleです。整数として使いたい場合は、必要に応じて変換します。

C#
char c = '5';
int number = (int)char.GetNumericValue(c);

Console.WriteLine(number);

ただし、数値ではない文字の場合は注意が必要です。

C#
char c = 'A';
double number = char.GetNumericValue(c);

Console.WriteLine(number);

数値として解釈できない文字では、-1が返ります。

5-4. 文字コード変換で注意すべきポイント

charintの変換では、目的を明確にすることが重要です。

文字コードを取得したい場合は、intへのキャストを使います。

C#
char c = 'A';
int code = (int)c; // 65

数字文字を数値にしたい場合は、c - '0'char.GetNumericValueを使います。

C#
char c = '7';
int number = c - '0'; // 7

ただし、c - '0''0'から'9'までの数字文字であることが前提です。

安全に処理するには、char.IsDigitで確認してから変換します。

C#
char c = '7';

if (char.IsDigit(c))
{
int number = c - '0';
Console.WriteLine(number);
}
else
{
Console.WriteLine("数字ではありません");
}

このように、変換前に文字の種類を確認すると安全です。

6. charの比較方法

charは、等しいかどうかを比較したり、文字コード順で大小比較したりできます。入力チェックや条件分岐でよく使います。

6-1. ==演算子でcharを比較する

2つのcharが同じ文字かどうかを調べるには、==演算子を使います。

C#
char a = 'A';
char b = 'A';

if (a == b)
{
Console.WriteLine("同じ文字です");
}

異なるかどうかを調べるには、!=を使います。

C#
char a = 'A';
char b = 'B';

if (a != b)
{
Console.WriteLine("異なる文字です");
}

ユーザーの入力から1文字を取り出して比較する場合にも使えます。

C#
string input = "y";

if (input.Length > 0 && input[0] == 'y')
{
Console.WriteLine("はいが選択されました");
}

6-2. CompareToメソッドで比較する

charにはCompareToメソッドがあります。これは、文字を順序として比較するときに使います。

C#
char a = 'A';
char b = 'B';

int result = a.CompareTo(b);

Console.WriteLine(result);

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

C#
0より小さい: 呼び出し元の文字が比較対象より前
0: 同じ文字
0より大きい: 呼び出し元の文字が比較対象より後

たとえば、'A''B'より前なので、負の値になります。

C#
char a = 'A';
char b = 'B';

if (a.CompareTo(b) < 0)
{
Console.WriteLine("AはBより前です");
}

6-3. 大文字・小文字を区別した比較

charの比較では、大文字と小文字は別の文字として扱われます。

C#
char a = 'A';
char b = 'a';

Console.WriteLine(a == b);

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

C#
False

大文字・小文字を区別せずに比較したい場合は、どちらかに統一してから比較します。

C#
char a = 'A';
char b = 'a';

if (char.ToLower(a) == char.ToLower(b))
{
Console.WriteLine("大文字小文字を無視すると同じです");
}

または、大文字に統一して比較します。

C#
char a = 'A';
char b = 'a';

if (char.ToUpper(a) == char.ToUpper(b))
{
Console.WriteLine("同じ文字です");
}

6-4. charと文字コード順の関係

charの大小比較は、文字コードの順序に基づきます。

C#
char a = 'A';
char b = 'B';

Console.WriteLine(a < b);

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

C#
True

'A'の文字コードは65'B'66なので、'A' < 'B'trueになります。

数字文字も文字コード順で比較されます。

C#
char a = '1';
char b = '9';

Console.WriteLine(a < b);

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

C#
True

ただし、文字コード順は辞書順や自然な日本語の並び順とは必ずしも同じではありません。

C#
char upper = 'Z';
char lower = 'a';

Console.WriteLine(upper < lower);

このような比較は文字コードに基づいているため、アルファベット順の感覚とは異なる結果に見えることがあります。

7. charで使える便利な判定メソッド

C#のcharには、文字の種類を判定するための便利なメソッドが用意されています。入力チェックやバリデーションで非常によく使います。

7-1. char.IsDigitで数字か判定する

char.IsDigitを使うと、文字が数字かどうかを判定できます。

C#
char c = '5';

if (char.IsDigit(c))
{
Console.WriteLine("数字です");
}
else
{
Console.WriteLine("数字ではありません");
}

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

C#
数字です

数字文字かどうかを確認してから数値に変換すると安全です。

C#
char c = '8';

if (char.IsDigit(c))
{
int number = c - '0';
Console.WriteLine(number);
}

7-2. char.IsLetterで文字か判定する

char.IsLetterを使うと、文字がアルファベットや日本語などの「文字」かどうかを判定できます。

C#
char c = 'A';

if (char.IsLetter(c))
{
Console.WriteLine("文字です");
}

日本語にも使えます。

C#
char c = 'あ';

Console.WriteLine(char.IsLetter(c));

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

C#
True

数字や記号の場合はfalseになります。

C#
Console.WriteLine(char.IsLetter('1')); // False
Console.WriteLine(char.IsLetter('#')); // False

7-3. char.IsWhiteSpaceで空白か判定する

char.IsWhiteSpaceを使うと、空白文字かどうかを判定できます。

C#
char c = ' ';

if (char.IsWhiteSpace(c))
{
Console.WriteLine("空白です");
}

半角スペースだけでなく、タブや改行も空白として判定されます。

C#
Console.WriteLine(char.IsWhiteSpace(' '));  // True
Console.WriteLine(char.IsWhiteSpace('\t')); // True
Console.WriteLine(char.IsWhiteSpace('\n')); // True

入力文字列から空白を取り除きたい場合などに便利です。

C#
string text = "A B C";

foreach (char c in text)
{
if (!char.IsWhiteSpace(c))
{
Console.Write(c);
}
}

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

C#
ABC

7-4. char.IsUpper・char.IsLowerで大文字小文字を判定する

char.IsUpperを使うと、大文字かどうかを判定できます。

C#
char c = 'A';

Console.WriteLine(char.IsUpper(c));

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

C#
True

char.IsLowerを使うと、小文字かどうかを判定できます。

C#
char c = 'a';

Console.WriteLine(char.IsLower(c));

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

C#
True

パスワードに大文字と小文字の両方が含まれているかを確認するときにも使えます。

C#
string password = "Abc123";
bool hasUpper = false;
bool hasLower = false;

foreach (char c in password)
{
if (char.IsUpper(c))
{
hasUpper = true;
}

if (char.IsLower(c))
{
hasLower = true;
}
}

Console.WriteLine(hasUpper);
Console.WriteLine(hasLower);

7-5. char.IsPunctuationで記号か判定する

char.IsPunctuationを使うと、句読点や記号の一部かどうかを判定できます。

C#
char c = '!';

if (char.IsPunctuation(c))
{
Console.WriteLine("句読点または記号です");
}

たとえば、次のような文字はtrueになることがあります。

C#
Console.WriteLine(char.IsPunctuation('.'));
Console.WriteLine(char.IsPunctuation(','));
Console.WriteLine(char.IsPunctuation('!'));
Console.WriteLine(char.IsPunctuation('?'));

ただし、すべての記号がIsPunctuationtrueになるわけではありません。記号全般を判定したい場合は、char.IsSymbolなども検討します。

C#
Console.WriteLine(char.IsSymbol('+'));
Console.WriteLine(char.IsSymbol('$'));

用途に応じて、IsPunctuationIsSymbolIsLetterIsDigitなどを使い分けることが大切です。

8. charの大文字・小文字変換

C#では、char.ToUpperchar.ToLowerを使って、文字を大文字や小文字に変換できます。

8-1. char.ToUpperで大文字に変換する

char.ToUpperを使うと、小文字を大文字に変換できます。

C#
char c = 'a';
char upper = char.ToUpper(c);

Console.WriteLine(upper);

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

C#
A

すでに大文字の場合は、そのまま返されます。

C#
char c = 'A';
char upper = char.ToUpper(c);

Console.WriteLine(upper);

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

C#
A

入力文字を大文字に統一して比較したいときに便利です。

C#
char input = 'y';

if (char.ToUpper(input) == 'Y')
{
Console.WriteLine("Yesが選択されました");
}

8-2. char.ToLowerで小文字に変換する

char.ToLowerを使うと、大文字を小文字に変換できます。

C#
char c = 'A';
char lower = char.ToLower(c);

Console.WriteLine(lower);

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

C#
a

すでに小文字の場合は、そのまま返されます。

C#
char c = 'a';
char lower = char.ToLower(c);

Console.WriteLine(lower);

文字を小文字に統一してから比較すると、大文字小文字を無視した判定ができます。

C#
char a = 'Q';
char b = 'q';

if (char.ToLower(a) == char.ToLower(b))
{
Console.WriteLine("同じ文字として扱います");
}

8-3. 英字以外を変換するときの挙動

char.ToUpperchar.ToLowerは、変換できる文字であれば変換し、変換対象でない文字は基本的にそのまま返します。

C#
Console.WriteLine(char.ToUpper('a')); // A
Console.WriteLine(char.ToUpper('1')); // 1
Console.WriteLine(char.ToUpper('?')); // ?
Console.WriteLine(char.ToUpper('あ')); // あ

数字や記号、日本語のひらがななどは、大文字・小文字という概念がないため、変換してもそのままです。

C#
char digit = '5';
char result = char.ToLower(digit);

Console.WriteLine(result);

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

C#
5

そのため、英字だけを変換したい場合でも、特別な処理を書かなくてよいケースが多いです。

8-4. 文化圏を考慮した変換の注意点

大文字・小文字の変換では、文化圏によって結果が異なる場合があります。特にトルコ語など、一部の言語ではiIの扱いが英語とは異なることがあります。

通常の単純な文字変換では、次のように書けます。

C#
char c = 'i';
char upper = char.ToUpper(c);

Console.WriteLine(upper);

文化圏に依存しない変換をしたい場合は、char.ToUpperInvariantchar.ToLowerInvariantを使うことがあります。

C#
char c = 'i';
char upper = char.ToUpperInvariant(c);

Console.WriteLine(upper);

ID、コード、プログラム内部の識別子など、文化圏に影響されない比較や変換をしたい場合は、ToUpperInvariantToLowerInvariantを使うと安全です。

C#
char a = 'A';
char b = 'a';

if (char.ToUpperInvariant(a) == char.ToUpperInvariant(b))
{
Console.WriteLine("同じ文字です");
}

一方、ユーザーに表示する自然言語の文字列を扱う場合は、文化圏を考慮した変換が必要になることもあります。

9. charの実践的な使い方

charは、文字列処理や入力チェックでよく使われます。ここでは、実際のプログラムで使いやすい例を紹介します。

9-1. 文字列から1文字ずつ取り出す

文字列から特定の位置の文字を取り出すには、インデックスを使います。

C#
string text = "Hello";

char first = text[0];
char second = text[1];

Console.WriteLine(first);
Console.WriteLine(second);

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

C#
H
e

最後の文字を取り出したい場合は、Length - 1を使います。

C#
string text = "Hello";

char last = text[text.Length - 1];

Console.WriteLine(last);

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

C#
o

ただし、空文字の場合はエラーになるため、事前に長さを確認します。

C#
string text = "";

if (text.Length > 0)
{
char last = text[text.Length - 1];
Console.WriteLine(last);
}
else
{
Console.WriteLine("文字列が空です");
}

9-2. foreachでstringを1文字ずつ処理する

stringforeachで1文字ずつ処理できます。このとき、取り出される値はcharです。

C#
string text = "CSharp";

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

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

C#
C
S
h
a
r
p

文字列の中に数字が何個含まれているかを数えることもできます。

C#
string text = "A1B2C3";
int count = 0;

foreach (char c in text)
{
if (char.IsDigit(c))
{
count++;
}
}

Console.WriteLine(count);

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

C#
3

このように、foreachcharの判定メソッドを組み合わせると、文字列を簡単に分析できます。

9-3. 入力された文字の種類を判定する

ユーザーが入力した文字を判定する例を見てみましょう。

C#
Console.WriteLine("1文字入力してください:");
string input = Console.ReadLine();

if (!string.IsNullOrEmpty(input))
{
char c = input[0];

if (char.IsDigit(c))
{
Console.WriteLine("数字です");
}
else if (char.IsLetter(c))
{
Console.WriteLine("文字です");
}
else if (char.IsWhiteSpace(c))
{
Console.WriteLine("空白です");
}
else
{
Console.WriteLine("その他の文字です");
}
}

Console.ReadLineの戻り値はstringです。そのため、最初の1文字をinput[0]で取り出してcharとして扱います。

入力が空の場合にinput[0]を実行するとエラーになるため、string.IsNullOrEmptyでチェックしています。

9-4. パスワードやIDの文字チェックに使う

charは、パスワードやIDの入力チェックにも使えます。

たとえば、パスワードに英字と数字が含まれているかを確認するコードです。

C#
string password = "abc123";

bool hasLetter = false;
bool hasDigit = false;

foreach (char c in password)
{
if (char.IsLetter(c))
{
hasLetter = true;
}

if (char.IsDigit(c))
{
hasDigit = true;
}
}

if (hasLetter && hasDigit)
{
Console.WriteLine("有効なパスワードです");
}
else
{
Console.WriteLine("英字と数字を含めてください");
}

大文字、小文字、数字をそれぞれチェックすることもできます。

C#
string password = "Abc123";

bool hasUpper = false;
bool hasLower = false;
bool hasDigit = false;

foreach (char c in password)
{
if (char.IsUpper(c))
{
hasUpper = true;
}
else if (char.IsLower(c))
{
hasLower = true;
}
else if (char.IsDigit(c))
{
hasDigit = true;
}
}

if (hasUpper && hasLower && hasDigit)
{
Console.WriteLine("条件を満たしています");
}
else
{
Console.WriteLine("大文字・小文字・数字を含めてください");
}

IDに英数字だけを許可したい場合は、次のように書けます。

C#
string id = "User123";
bool valid = true;

foreach (char c in id)
{
if (!char.IsLetterOrDigit(c))
{
valid = false;
break;
}
}

Console.WriteLine(valid ? "有効なIDです" : "無効なIDです");

9-5. CSVや区切り文字の処理に使う

charは、カンマやタブなどの区切り文字を扱うときにも使います。

たとえば、カンマ区切りの文字列を分割する場合です。

C#
string csv = "apple,banana,orange";
char delimiter = ',';

string[] items = csv.Split(delimiter);

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

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

C#
apple
banana
orange

タブ区切りの場合は、タブ文字'\t'を使います。

C#
string data = "A\tB\tC";
char delimiter = '\t';

string[] items = data.Split(delimiter);

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

1文字の区切り文字を扱う場合、charを使うとコードがわかりやすくなります。

C#
char comma = ',';
char colon = ':';
char semicolon = ';';

区切り文字を変数にしておくと、あとから変更しやすくなります。

10. charを使うときの注意点

charはシンプルな型ですが、初心者がつまずきやすいポイントがあります。特に、文字数、クォーテーション、空文字、null、絵文字の扱いには注意しましょう。

10-1. charには複数文字を代入できない

charに代入できるのは1文字だけです。

C#
char c = 'A'; // OK

次のように複数文字を代入するとエラーになります。

C#
char c = 'AB'; // エラー

複数文字を扱いたい場合はstringを使います。

C#
string text = "AB";

1文字か複数文字かを意識して、charstringを使い分けることが大切です。

10-2. ダブルクォーテーションとシングルクォーテーションの違い

C#では、シングルクォーテーションとダブルクォーテーションで意味が変わります。

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

'A'char"A"stringです。

次のコードはエラーになります。

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

反対に、stringにシングルクォーテーションの文字をそのまま代入することもできません。

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

正しくは次のように書きます。

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

10-3. 空文字はcharに代入できない

stringでは空文字を扱えます。

C#
string empty = "";

しかし、charには空文字を代入できません。

C#
char c = ''; // エラー

charは必ず1つの文字を表す型です。何もない状態を表したい場合は、char?や特別な値を使います。

たとえば、初期値としてヌル文字を使うことはできます。

C#
char c = '\0';

ただし、'\0'は空文字ではなく、ヌル文字という1つの文字です。

10-4. nullを扱いたい場合はchar?を使う

通常のcharにはnullを代入できません。

C#
char c = null; // エラー

charで値がない状態を表したい場合は、Nullable型のchar?を使います。

C#
char? c = null;

値を入れることもできます。

C#
char? c = 'A';

if (c.HasValue)
{
Console.WriteLine(c.Value);
}
else
{
Console.WriteLine("値がありません");
}

char?は、charまたはnullを扱える型です。

C#
char? selected = null;

selected = 'Y';

「まだ選択されていない」「入力がない」といった状態を表したいときに便利です。

10-5. 絵文字やサロゲートペアの扱いに注意する

charは1つのUnicode文字を扱う型ですが、絵文字など一部の文字は1つのcharでは表せない場合があります。

C#
string emoji = "😀";

Console.WriteLine(emoji.Length);

見た目は1文字でも、Length2になることがあります。

C#
foreach (char c in emoji)
{
Console.WriteLine((int)c);
}

このような文字は、サロゲートペアとして2つのcharで表されます。

そのため、絵文字を含む文字列を処理するときに、単純にchar単位で分割すると、文字が壊れたように扱われることがあります。

通常の英数字や日本語の多くを扱う場合はcharで問題ありませんが、絵文字や一部の特殊文字を正確に扱いたい場合は、Runeなど別の方法を検討します。

11. charでよくあるエラーと解決方法

ここでは、C#のcharを使うときによく出るエラーと、その解決方法を紹介します。

11-1. Too many characters in character literalの原因

Too many characters in character literalは、charに複数の文字を入れようとしたときに発生するエラーです。

C#
char c = 'AB'; // エラー

charは1文字しか扱えません。

解決方法は、1文字だけにすることです。

C#
char c = 'A';

複数文字を扱いたい場合は、stringを使います。

C#
string s = "AB";

シングルクォーテーションで複数文字を囲むとエラーになるため、文字列にはダブルクォーテーションを使いましょう。

11-2. Cannot convert type string to charの原因

Cannot convert type string to charは、stringcharに代入しようとしたときに発生します。

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

"A"は1文字に見えますが、型はstringです。charに代入するには、シングルクォーテーションを使います。

C#
char c = 'A';

すでにstringとして持っている値からcharを取り出したい場合は、インデックスを使います。

C#
string s = "A";
char c = s[0];

Console.WriteLine(c);

ただし、文字列が空の場合はエラーになるため、長さを確認しましょう。

C#
string s = "A";

if (s.Length > 0)
{
char c = s[0];
Console.WriteLine(c);
}

11-3. 空文字をcharに代入しようとした場合

次のコードはエラーになります。

C#
char c = '';

charは必ず1文字が必要です。空文字はstringで使うものです。

C#
string s = "";

charで未設定のような状態を表したい場合は、char?を使います。

C#
char? c = null;

または、特別な初期値としてヌル文字を使うこともあります。

C#
char c = '\0';

ただし、'\0'は空ではなく、文字コード0の文字です。意味を明確にして使いましょう。

11-4. stringのインデックス範囲外エラー

文字列からcharを取り出すときに、存在しない位置を指定するとエラーになります。

C#
string text = "ABC";
char c = text[3]; // エラー

"ABC"のインデックスは次のようになります。

C#
text[0] // A
text[1] // B
text[2] // C

text[3]は存在しないため、範囲外エラーになります。

安全にアクセスするには、Lengthを確認します。

C#
string text = "ABC";
int index = 2;

if (index >= 0 && index < text.Length)
{
char c = text[index];
Console.WriteLine(c);
}
else
{
Console.WriteLine("インデックスが範囲外です");
}

先頭の文字を取り出す場合も、空文字に注意します。

C#
string text = "";

if (!string.IsNullOrEmpty(text))
{
char first = text[0];
Console.WriteLine(first);
}
else
{
Console.WriteLine("文字列が空です");
}

12. charに関するよくある質問

C#のcharについて、初心者が疑問に感じやすいポイントをまとめます。

12-1. charとstringはどちらを使えばいい?

1文字だけを扱う場合はcharを使います。

C#
char c = 'A';

複数文字や文章、名前、単語を扱う場合はstringを使います。

C#
string name = "Taro";
string message = "Hello";

また、1文字だけでも文字列として扱いたい場合はstringを使うことがあります。

C#
string s = "A";

目安としては、文字の種類を判定したい、文字列を1文字ずつ処理したい、区切り文字を扱いたい場合はcharが便利です。

一方、画面表示、入力値、文章、名前、メールアドレスなどは基本的にstringで扱います。

12-2. charに日本語は入れられる?

はい、入れられます。

C#
char c1 = 'あ';
char c2 = '漢';

Console.WriteLine(c1);
Console.WriteLine(c2);

ひらがな、カタカナ、漢字など、多くの日本語文字はcharで扱えます。

ただし、見た目上の1文字が必ず1つのcharになるとは限りません。絵文字や一部の特殊な文字では、複数のcharで表されることがあります。

通常の日本語文字を1文字だけ扱う場合は、charで問題ありません。

12-3. charに数字は入れられる?

はい、数字文字を入れることができます。

C#
char c = '5';

ただし、これは数値の5ではなく、文字の'5'です。

C#
char c = '5';
int number = 5;

'5'を数値の5として使いたい場合は、変換が必要です。

C#
char c = '5';
int number = c - '0';

Console.WriteLine(number);

変換前に数字かどうかを確認すると安全です。

C#
char c = '5';

if (char.IsDigit(c))
{
int number = c - '0';
Console.WriteLine(number);
}

12-4. charを空にする方法はある?

通常のcharを完全に空にすることはできません。charは必ず1つの文字を持つ型です。

空文字はstringで表します。

C#
string empty = "";

charで「値がない」状態を表したい場合は、char?を使います。

C#
char? c = null;

または、特別な値として'\0'を使うこともあります。

C#
char c = '\0';

ただし、'\0'は空ではなく、ヌル文字です。未入力や未設定を表すなら、char?のほうが意味が明確です。

12-5. char配列はどんな場面で使う?

char配列は、文字列を1文字ずつ操作したいときに使います。

C#
char[] chars = { 'H', 'e', 'l', 'l', 'o' };
string text = new string(chars);

Console.WriteLine(text);

文字列をchar配列に変換することもできます。

C#
string text = "Hello";
char[] chars = text.ToCharArray();

たとえば、文字列の一部を変更したい場合に使えます。

C#
string text = "cat";
char[] chars = text.ToCharArray();

chars[0] = 'b';

string result = new string(chars);
Console.WriteLine(result);

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

C#
bat

stringは基本的に直接中身を変更できないため、1文字ずつ変更したい場合にchar配列へ変換する方法が役立ちます。

まとめ

C#のcharは、1文字を扱うための基本的なデータ型です。英字、数字、記号、日本語などを1文字単位で扱うことができます。

charを使うときは、シングルクォーテーションで1文字を囲みます。

C#
char c = 'A';

ダブルクォーテーションを使うとstringになるため、charとは別の型として扱われます。

C#
string s = "A";

charstringの違いは非常に重要です。charは1文字、stringは文字列を扱います。

C#
char c = 'A';
string text = "ABC";

文字列から1文字を取り出すと、その値はcharになります。

C#
string text = "ABC";
char first = text[0];

また、charには文字の種類を判定する便利なメソッドが用意されています。

C#
char.IsDigit('1');
char.IsLetter('A');
char.IsWhiteSpace(' ');
char.IsUpper('A');
char.IsLower('a');

これらを使うことで、入力チェックやパスワード検証、文字列解析などを簡単に実装できます。

charは内部的にはUnicodeの文字コードを持っているため、intに変換して文字コードを確認したり、文字コードからcharを作ったりできます。

C#
char c = 'A';
int code = (int)c;

ただし、数字文字を数値に変換する場合は注意が必要です。

C#
char c = '5';
int number = c - '0';

(int)cでは文字コードが取得されるため、数値としての5にはなりません。

さらに、絵文字や一部の特殊文字は、見た目は1文字でも複数のcharで表される場合があります。通常の英数字や日本語を扱う場合は問題ありませんが、絵文字を正確に処理したい場合は注意が必要です。

charは小さな型ですが、C#で文字列処理を行ううえで非常に重要です。1文字の取り出し、比較、変換、判定を正しく理解しておくことで、入力チェックやデータ処理のコードをより安全で読みやすく書けるようになります。