C#でプログラミングを行う際、既存の文字列の特定の場所に新しい文字を割り込ませたい場面は頻繁に発生します。
例えば、ユーザー名に敬称を付け加えたり、数値データの間にハイフンを挿入して読みやすく整えたりする場合です。
このような操作を簡単かつ確実に行うための手段が、stringクラスに用意されているInsertメソッドです。
この記事では、初心者の方から実務で活用したい方まで幅広く役立つよう、Insertメソッドの基本的な仕組みから、エラーを防ぐための注意点、さらにはパフォーマンスを意識した応用テクニックまで詳しく解説します。
C#のInsertメソッドとは?
C#におけるstring.Insertメソッドは、指定した位置(インデックス)に別の文字列を挿入し、新しい文字列を生成して返すためのメソッドです。
このメソッドを使いこなすことで、複雑な文字列編集をシンプルに記述できるようになります。

基本的な構文と戻り値
Insertメソッドの構文は非常にシンプルです。
第1引数に「挿入を開始する位置」、第2引数に「挿入したい文字列」を指定します。
public string Insert(int startIndex, string value);
このメソッドの最大の特徴は、元の文字列を直接書き換えるのではなく、挿入後の新しい文字列を戻り値として返すという点です。
C#のstring型は一度作成すると内容を変更できない「不変(イミュータブル)」な性質を持っているため、このような挙動になります。
インデックスの考え方
C#の文字列は、先頭の文字を「0」番目として数える0ベースのインデックスを採用しています。
| インデックス | 0 | 1 | 2 | 3 | 4 |
|---|---|---|---|---|---|
| 文字 | H | e | l | l | o |
例えば、「Hello」という文字列の「H」と「e」の間に文字を入れたい場合は、インデックス「1」を指定します。
インデックス「0」を指定した場合は先頭への挿入となり、文字列の長さと同じ数値を指定した場合は末尾への追加となります。
Insertメソッドの基本的な使い方
それでは、実際のソースコードを見ながら、どのように文字列が挿入されるのかを確認していきましょう。

文字列の途中に挿入する
最も一般的な使い方は、単語と単語の間に文字を入れるケースです。
using System;
class Program
{
static void Main()
{
string original = "C#Language";
// インデックス2の位置に空白を挿入する
// 0:C, 1:#, の直後(2の位置)に挿入される
string result = original.Insert(2, " ");
Console.WriteLine("元の文字列: " + original);
Console.WriteLine("変更後: " + result);
}
}
元の文字列: C#Language
変更後: C# Language
先頭や末尾に挿入する場合
Insertメソッドを使えば、先頭や末尾に文字列を追加することも可能です。
ただし、末尾への追加に関しては、通常は+演算子やstring.Concatの方が直感的かもしれません。
using System;
class Program
{
static void Main()
{
string target = "World";
// 先頭(インデックス0)に挿入
string prefix = target.Insert(0, "Hello ");
// 末尾(現在の長さと同じインデックス)に挿入
string suffix = prefix.Insert(prefix.Length, "!");
Console.WriteLine(suffix);
}
}
Hello World!
注意点:文字列の「不変性(イミュータブル)」について
C#で文字列操作を行う上で、絶対に避けて通れない概念が不変性(Immutability)です。
Insertメソッドを使用する際、初心者が陥りやすいミスがあります。
元の文字列は書き換わらない
次のコードを見てください。
string text = "C#";
text.Insert(2, " .NET"); // これだけでは意味がない
Console.WriteLine(text); // 出力は「C#」のまま
このコードを実行しても、変数textの中身は変わりません。
Insertメソッドは「挿入した結果の新しい文字列」を生成しますが、元の変数の中身を上書きすることはないからです。
必ず、戻り値を変数に代入し直す必要があります。

実行時に発生する例外と対処法
Insertメソッドは便利ですが、引数に渡す値によってはプログラムが強制終了(例外の発生)してしまうことがあります。
安全なコードを書くためには、これらの例外を理解しておくことが重要です。
ArgumentOutOfRangeExceptionの回避
挿入位置を指定するインデックスが、文字列の範囲を超えている場合にArgumentOutOfRangeExceptionが発生します。
- インデックスがマイナス値の場合
- インデックスが文字列の長さ(
Length)より大きい場合
これを防ぐためには、事前にインデックスが有効な範囲内にあるかチェックするか、動的に長さを取得して計算するようにします。
string msg = "Sample";
int targetIndex = 10;
// 安全な挿入の例
if (targetIndex >= 0 && targetIndex <= msg.Length)
{
msg = msg.Insert(targetIndex, "Data");
}
else
{
Console.WriteLine("インデックスが範囲外です。");
}
null値の扱い
Insertメソッドの第2引数(挿入する文字列)にnullを渡すと、ArgumentNullExceptionが発生します。
挿入するデータが外部入力やデータベースからの値である場合は、事前にnullチェックを行うか、空文字("")に置換するなどの処理が必要です。
大量に挿入する場合のパフォーマンス対策
単発の文字列挿入であればstring.Insertで全く問題ありません。
しかし、ループの中で何万回も挿入を繰り返すような処理では、急激にパフォーマンスが悪化します。
これは、挿入のたびに新しい文字列オブジェクトがメモリ上に生成されるためです。
StringBuilderクラスの利用
大量の挿入処理を行う場合は、System.Text.StringBuilderクラスを使用するのが定石です。
StringBuilderは、内部のバッファを直接書き換えるため、メモリ消費を抑えつつ高速に動作します。
using System;
using System.Text;
class Program
{
static void Main()
{
// StringBuilderを初期化
StringBuilder sb = new StringBuilder("ABCDE");
// 大量の挿入をシミュレート
for (int i = 0; i < 5; i++)
{
// StringBuilderのInsertは自分自身を書き換える
sb.Insert(2, "-");
}
Console.WriteLine(sb.ToString());
}
}
AB-----CDE
StringBuilderのInsertメソッドは、stringクラスのものと使い方は似ていますが、「自分自身の値を変更する」という点が決定的に異なります。
他の手法との比較
文字列の中に特定の文字を入れたい場合、Insert以外にもいくつかの方法があります。
状況に応じて最適なものを選びましょう。
| 手法 | 特徴 | 適したケース |
|---|---|---|
| Insert | 指定位置にピンポイントで追加 | 規則的なフォーマット作成 |
| 文字列補間 ($””) | 変数を埋め込んで構築 | テンプレートに値を当てはめる時 |
| Replace | 特定の文字を別の文字に置換 | 既存の目印を変換する時 |
| StringBuilder | 編集可能な文字列バッファ | ループ内での大量編集 |
文字列補間との違い
C# 6.0以降で主流となっている文字列補間($"{var}")は、あらかじめ構成が決まっている場合に非常に強力です。
string name = "田中";
// 文字列補間
string welcome = $"こんにちは、{name}様。";
// Insertで同じことをする場合
string baseText = "こんにちは、様。";
string result = baseText.Insert(6, name);
「どこに挿入するか」が実行時に数値で決まる場合はInsertが適しており、「文章のこの位置にこれを入れる」と決まっている場合は文字列補間の方が読みやすいコードになります。

まとめ
C#のstring.Insertメソッドは、指定した位置に文字列を挿入するための非常に直感的で便利なツールです。
今回のポイントを整理すると以下の通りです。
- 0ベースのインデックスで挿入位置を指定する。
- 文字列は不変であるため、戻り値を必ず受け取る必要がある。
- インデックスの範囲外指定やnullの挿入は例外(エラー)の原因となるため注意する。
- パフォーマンスが求められるループ処理では
StringBuilderの使用を検討する。
これらの特性を理解しておけば、テキスト処理やデータの整形をより安全かつ効率的に行えるようになります。
C#における文字列操作の基本として、ぜひマスターしておきましょう。
