C#の開発において、文字列は不変(イミュータブル)なオブジェクトとして扱われます。
一度作成された文字列の内容を直接書き換えることはできません。
しかし、特定の文字を頻繁に変更したり、並び替えたり、文字単位で高度なアルゴリズムを適用したい場合には、文字列を文字配列(char[])に変換する手法が非常に有効です。
その中心的な役割を担うのがToCharArrayメソッドです。
この記事では、C#におけるToCharArrayの基本的な使い方から、範囲を指定した変換、さらにはメモリ効率を意識した最新のプログラミング手法までを詳しく解説します。
ToCharArrayメソッドの基本概念
C#のSystem.Stringクラスに用意されているToCharArrayメソッドは、文字列を構成する各文字を抽出し、新しいchar型の配列として返すメソッドです。

なぜ文字配列に変換するのか
C#の文字列は、作成後にその内容を変更することができません。
例えば、3番目の文字だけを「X」に変えたいと思っても、str[2] = 'X';のような記述はコンパイルエラーとなります。
そこで、一度文字配列に変換して配列要素を書き換え、再度文字列に戻すというステップを踏むことで、間接的に文字列の編集を実現します。
また、暗号化処理や特定の文字探索において、配列として扱う方がインデックス操作が容易になるケースも多々あります。
ToCharArrayの基本的な構文
最もシンプルな使い方は、引数なしのToCharArray()を呼び出す方法です。
これにより、文字列全体が配列にコピーされます。
using System;
class Program
{
static void Main()
{
// 元の文字列を定義
string original = "CSharp";
// 文字列を文字配列に変換
char[] charArray = original.ToCharArray();
// 配列の内容を表示
foreach (char c in charArray)
{
Console.WriteLine($"文字: {c}");
}
}
}
文字: C
文字: S
文字: h
文字: a
文字: r
文字: p
特定の範囲を抽出して変換する方法
ToCharArrayには、文字列全体ではなく特定の部分だけを配列として取り出すオーバーロードが存在します。

引数付きのToCharArrayメソッド
引数には「開始インデックス」と「抽出する文字数」を指定します。
| 引数 | 型 | 説明 |
|---|---|---|
| startIndex | int | 抽出を開始する0から始まる位置 |
| length | int | 抽出する文字の総数 |
このメソッドを使用すると、不要なメモリ消費を抑えつつ、必要な部分だけを効率的に操作できます。
using System;
class Program
{
static void Main()
{
string text = "Modern C# Development";
// インデックス7から2文字("C#")を抽出して配列にする
char[] subChars = text.ToCharArray(7, 2);
// 結果の確認
Console.WriteLine(new string(subChars)); // "C#" と表示される
}
}
C#
文字配列から文字列への再変換
ToCharArrayで文字配列にした後、加工が終わったら再びstring型に戻すのが一般的な流れです。
これにはstringクラスのコンストラクタを利用します。
文字配列を結合して文字列に戻す
文字配列を引数に取るnew string(char[])を使用することで、配列内の全要素を連結した新しい文字列を生成できます。
using System;
class Program
{
static void Main()
{
string source = "apple";
char[] chars = source.ToCharArray();
// 配列の最初の文字を大文字に変更(配列なので変更可能)
chars[0] = 'A';
// 文字配列から新しい文字列を作成
string result = new string(chars);
Console.WriteLine($"変換前: {source}");
Console.WriteLine($"変換後: {result}");
}
}
変換前: apple
変換後: Apple

文字列操作の実践的なサンプル
ここでは、ToCharArrayを活用した具体的なプログラミング例をいくつか紹介します。
文字列を反転させる
文字列を逆順にする処理は、文字配列に変換することで非常に簡単に実装できます。
配列にはArray.Reverseという便利なメソッドが用意されているためです。
using System;
class Program
{
static void Main()
{
string input = "たけやぶやけた";
// 1. 文字配列に変換
char[] chars = input.ToCharArray();
// 2. 配列の順序を反転
Array.Reverse(chars);
// 3. 文字列に戻す
string reversed = new string(chars);
Console.WriteLine($"元の文字列: {input}");
Console.WriteLine($"反転後: {reversed}");
}
}
元の文字列: たけやぶやけた
反転後: たけやぶやけた
特定の文字種をカウント・置換する
例えば、パスワード文字列の中に含まれる特定の記号を伏せ字にしたり、文字コードを計算したりする場合、foreachで回すよりも配列として処理する方が柔軟な場合があります。
using System;
class Program
{
static void Main()
{
string secret = "P@ssw0rd123";
char[] chars = secret.ToCharArray();
for (int i = 0; i < chars.Length; i++)
{
// 数字をすべて '*' に置き換える
if (char.IsDigit(chars[i]))
{
chars[i] = '*';
}
}
string masked = new string(chars);
Console.WriteLine($"マスク後: {masked}");
}
}
マスク後: P@ssw0rd***
パフォーマンスとメモリに関する注意点
ToCharArrayを使用する際に意識しておくべき重要なポイントは、メモリの割り当て(アロケーション)です。
コピーが発生することの理解
ToCharArrayは、元の文字列と同じサイズの新しい配列をヒープ領域に作成し、文字を一つずつコピーします。
そのため、非常に長い文字列に対して頻繁に呼び出すと、ガベージコレクション(GC)の負荷が高まる原因になります。
読み取り専用ならインデクサを使用する
単に特定のインデックスの文字を参照したいだけであれば、変換は不要です。
文字列自体にインデクサが実装されているため、str[i]で直接アクセスできます。
Span<T>の活用 (C# 7.2以降)
最新のC#では、ReadOnlySpan<char>を使用することで、メモリをコピーせずに文字列を配列のように扱うことが可能です。
string text = "Large string...";
// AsSpan() はコピーを作成せず、元のメモリを参照する
ReadOnlySpan<char> span = text.AsSpan();
// 配列のようにアクセスできるが、メモリコピーが発生しないため高速
char first = span[0];

ToCharArrayと周辺メソッドの比較
文字列から文字データを取得する方法はいくつかあります。
状況に応じて適切なものを選択しましょう。
| 手法 | 特徴 | 適した用途 |
|---|---|---|
ToCharArray() | 新しい配列を作成してコピーする | 文字列の内容を自由に書き換えたい場合 |
string[index] | 文字列の特定位置に直接アクセス | 1文字だけ読み取りたい場合 |
AsSpan() | メモリコピーなしで参照 | 高パフォーマンスな読み取り処理 |
StringInfo | サロゲートペアを考慮して分割 | 絵文字などの特殊文字を正しく扱う場合 |
サロゲートペアへの配慮
C#のchar型は16ビット(UTF-16)です。
そのため、一部の絵文字や複雑な漢字などは2つのcharで1文字を表します(サロゲートペア)。
ToCharArrayを使うと、これらの文字は2つの要素に分割されてしまうため、文字数カウントや反転処理の際には注意が必要です。
絵文字を含む文字列を正確に扱いたい場合は、System.Globalization.StringInfoクラスを検討してください。
まとめ
C#のToCharArrayメソッドは、不変である文字列を可変な文字配列へと橋渡しする非常に便利なツールです。
基本的な使い方はシンプルですが、「新しい配列が生成される(コピーが発生する)」という特性を理解しておくことが、効率的なプログラムを書く鍵となります。
内容を書き換える必要があるならToCharArray、読み取りだけで良いならインデクサやSpan<T>を利用するといった使い分けを意識しましょう。
今回紹介した文字列の反転やマスク処理などのサンプルを参考に、日々の開発における文字列操作に役立ててください。
適切なメソッド選択により、コードの可読性とパフォーマンスの両立が可能になります。
