文字列から文字を扱う手段の非対称性 §
文字列から5番目の文字を取り出すのはs[4]だけでオッケーです。(0から数えるので、5ン番目は4になります)
文字列は配列ではありませんが、配列のように文字を取り出すインデクサが定義されています。
しかし、5番目の文字を書き換えるために、s[4]='X'とは書けません。
文字列は書き換えることが許されていないからです。
特定の文字を置き換えた文字列が欲しいなら、s.Substring(0, 4) + "4" + s.Substring(5);のように地道に連結して新しい文字列を作らねばなりません。
ちなみに、Replaceメソッドは指定の文字を全て置き換えてしまうので、位置指定の置き換えとは機能性がちょっと違います。
罠の数々 §
- C#では、文字列を書き換えることは許可されていないが、文字列型変数を書き換えることは許されている。この違いをはっきりと理解しておこう。(サンプルソースでも文字列型変数を書き換えている)
参考リンク §
String.Chars[Int32] プロパティ
とても分かりにくいが、文字列から1文字を取り出すインデクサの定義はドキュメントのサイトでは【String.Chars[Int32] プロパティ】に記載されている。上記のリンクから、本当にここにインデクサの情報が書かれていることを確認してみよう。
ついでに、なぜ読み出しはできるのに書き込みはできないのか。その理由を上記リンク先のページから確認してみよう。
ちなみに、Charsはインデクサのないプログラミング言語から使うときの名前である。C#プログラマが使うことはない名前である。
リポジトリ §
https://github.com/autumn009/cshowto
ReplaceChar §
using System;
class Program
{
static void Main()
{
var s = "斉藤家の3男";
Console.WriteLine($"元文字列: {s}");
Console.WriteLine($"何人目の男の子? {s[4]}");
s = s.Substring(0, 4) + "4" + s.Substring(5);
Console.WriteLine($"3→4修正後: {s}");
}
}
実行結果
元文字列: 斉藤家の3男
何人目の男の子? 3
3→4修正後: 斉藤家の4男