char型のふるまい
《 初回公開:2020/05/14 , 最終更新:未 》
char型は整数型に分類されるが文字を扱う特殊な整数型で、文字を扱うので文字列型とも関係が深い。
【 目次 】
文字型への値の代入
char型への値の代入には直接文字を代入する他にも
16 進数エスケープシーケンスやUnicode エスケープシーケンス,数値をchar型にキャストして代入
などといろいろあって、
char c1 = 'あ'; // 文字を直接代入 char c2 = '\x3042'; // 16 進数エスケープシーケンス char c3 = '\u3042'; // Unicode エスケープシーケンス char c4 = (char)0x3042; // 数値をchar型にキャスト // output: c1 = あ, c2 = あ, c3 = あ, c4 = あ Console.WriteLine($"c1 = {c1}, c2 = {c2}, c3 = {c3}, c4 = {c4}");
整数型
整数型への代入
文字なのに他の整数型へそのまま代入が可能。
char c = 'あ'; // 整数型に代入 int i = c;
整数型からの代入
整数型から文字型への代入にはキャストが必要
char c2 = (char)i; Console.WriteLine($"{c2},{i:x4}"); // output: あ,3042
書式指定
数値型の書式指定をしても受け付けない
Console.WriteLine($"{c},{c:x4}"); // output: あ,あ
キャストが必要
Console.WriteLine($"{c},{(int)c:x4}"); // output: あ,3042
char型の演算
char型が整数型の仲間だからといって、これは許されない。
c = c1 + c2; c = c + 1;
でもこれは許される。
var x = c1 + c2;
文字型を加算した結果がどんな型に格納されたかというと
Console.WriteLine($"xの型名: {x.GetType().Name}"); // output: xの型名: Int32
文字型を加算の結果はSystem.Int32型という事はint型に格納されるという事。
という事はchar型として整数演算の結果の値を受け取るにはキャストしてやれば良い。
c = (char)(c1 + c2);
文字列を加算した結果は
c = 'あ'; c = (char)(c + 10); Console.WriteLine($"{c}, 0x{(int)c:x4}"); // が, 0x304c
ユニコードで「あ」の10文字先には「が」の文字がマッピングされているという事。
キャストしなくてもインクリメントやデクリメントは許される。
c++; c--;
インクリメントやデクリメントの結果はどうなるかというと。
for (int i = 0; i < 3; i++) { c++; Console.WriteLine($"{c},0x{(int)c:x4}"); } for (int i = 0; i < 3; i++) { c--; Console.WriteLine($"{c},0x{(int)c:x4}"); }
実行結果
ぃ,0x3043 い,0x3044 ぅ,0x3045 い,0x3044 ぃ,0x3043 あ,0x3042
ユニコードの数字順に文字がならんでいて「あ」の後に「ぃ」があってその次に「い」がくるのが確認できる。
char型とstring型の変換
char型をstring型へ変換
string s; char c; // char => string 変換 c = 'あ'; s = c.ToString(); Console.WriteLine($"c = {c}, s={s}"); // output: c = あ, s=あ
string型をchar型へ変換
s = "あいう"; c = s[0]; Console.WriteLine($"c = {c}, s={s}"); // output: c = あ, s=あいう
char型の配列からstring型への変換
char型の配列からstring型への変換するには、char型の配列を引数とするstring型のコンストラクタを利用する。
char[] chars = new char[] { 'あ', 'い', 'う' }; string s = new string(chars); Console.WriteLine($"s = {s}"); // output: s = あいう
string型からchar型の配列への変換
string型からchar型の配列への変換するにはstring型のToCharArrayメソッドを利用。
char[] chars = s.ToCharArray(); // 一文字ずつ出力 Array.ForEach<char>(chars, c => Console.WriteLine(c));
文字列を一文字ずつコピーするなら
chars = new char[s.Length]; for (int i = 0; i < s.Length; i++) { chars[i] = s[i]; }
文字を連結して文字列へ
文字を連結して文字列として受け取るなんて事ができたらいいなと思ったのだが、こんな演算は許されない。
char c1 = 'あ'; char c2 = 'あ'; string s = c1 + c2;
面倒だが、素直に
string s = c1.ToString() + c2.ToString(); // s="あい"
やり方は他にもいろいろあって
string s = string.Concat(c1,c2);
ちょっと長いコーディングになるがStringBuilderを使うと。
これなら何文字も連結できる。
string s = new StringBuilder().Append(c1).Append(c2).ToString();
まあ、文字型では無く文字型配列を使えば簡単なのだが。
参考URL