C#の文字列操作:Stringクラスのプロパティ・メソッド・ベストプラクティス
C#では文字列を文字の配列として使用できますが、より一般的な方法はstringキーワードを使用して文字列変数を宣言することです。stringキーワードはSystem.Stringクラスのエイリアスです。
Stringオブジェクトの作成方法
Stringオブジェクトは以下の方法で作成できます。
- 文字列リテラルをString変数に代入
- Stringクラスのコンストラクタを使用
- 文字列連結演算子(
+)を使用 - 文字列を返すプロパティの取得やメソッドの呼び出し
- 書式設定メソッドを呼び出して値やオブジェクトを文字列表現に変換
作成例
using System;
namespace StringApplication {
class Program {
static void Main(string[] args) {
// 文字列リテラルと連結
string fname = "Rowan";
string lname = "Atkinson";
char[] letters = { 'H', 'e', 'l', 'l', 'o' };
string[] sarray = { "Hello", "From", "Tutorials", "Point" };
string fullname = fname + lname;
Console.WriteLine("Full Name: {0}", fullname);
// Stringコンストラクタ使用
string greetings = new string(letters);
Console.WriteLine("Greetings: {0}", greetings);
// メソッドで文字列取得
string message = String.Join(" ", sarray);
Console.WriteLine("Message: {0}", message);
// 書式設定メソッド
DateTime waiting = new DateTime(2012, 10, 10, 17, 58, 1);
string chat = String.Format("Message sent at {0:t} on {0:D}", waiting);
Console.WriteLine("Message: {0}", chat);
}
}
}
実行結果:
Full Name: RowanAtkinson
Greetings: Hello
Message: Hello From Tutorials Point
Message: Message sent at 5:58 PM on Wednesday, October 10, 2012
Stringクラスのプロパティ
| No. | プロパティと説明 |
|---|---|
| 1 | Chars 現在のStringオブジェクトの指定位置にあるCharオブジェクトを取得 |
| 2 | Length 現在のStringオブジェクトの文字数を取得 |
Stringクラスの主要メソッド
Stringクラスには文字列操作に役立つ多数のメソッドがあります。よく使用されるものを以下に示します。
| No. | メソッドと説明 |
|---|---|
| 1 | Compare(strA, strB) - 2つの文字列を比較し、ソート順での相対位置を示す整数を返す |
| 2 | Compare(strA, strB, ignoreCase) - 大文字小文字を無視して比較(ignoreCase=trueの場合) |
| 3 | Concat(str0, str1) - 2つの文字列を連結 |
| 4 | Concat(str0, str1, str2) - 3つの文字列を連結 |
| 5 | Contains(value) - 指定文字列が含まれるか判定 |
| 6 | Copy(str) - 指定文字列と同じ値を持つ新しいStringオブジェクトを作成 |
| 7 | CopyTo(sourceIndex, dest, destIndex, count) - 指定位置から文字を配列にコピー |
| 8 | EndsWith(value) - 指定文字列で終わるか判定 |
| 9 | Equals(value) - 現在の文字列と指定文字列が同じ値か判定 |
| 10 | Equals(a, b) - 2つの指定文字列が同じ値か判定(静的) |
| 11 | Format(format, arg0) - 書式項目をオブジェクトの文字列表現で置換 |
| 12 | IndexOf(value) - 指定文字/文字列の最初の出現位置(0ベース)を返す |
| 13 | IndexOf(value, startIndex) - 指定位置から検索開始 |
| 14 | IndexOfAny(anyOf) - 指定文字配列のいずれかが最初に出現する位置 |
| 15 | Insert(startIndex, value) - 指定位置に文字列を挿入した新しい文字列を返す |
| 16 | IsNullOrEmpty(value) - nullまたは空文字列か判定(静的) |
| 17 | Join(separator, values) - 区切り文字で文字列配列を連結(静的) |
| 18 | LastIndexOf(value) - 最後の出現位置を返す |
| 19 | Remove(startIndex) - 指定位置以降を削除 |
| 20 | Remove(startIndex, count) - 指定位置から指定文字数を削除 |
| 21 | Replace(oldChar, newChar) - 文字を置換 |
| 22 | Replace(oldValue, newValue) - 文字列を置換 |
| 23 | Split(separator) - 区切り文字で分割して文字列配列を返す |
| 24 | StartsWith(value) - 指定文字列で始まるか判定 |
| 25 | ToCharArray() - Unicode文字配列として取得 |
| 26 | ToLower() - 小文字に変換 |
| 27 | ToUpper() - 大文字に変換 |
| 28 | Trim() - 前後の空白文字を削除 |
| 29 | Substring(startIndex) - 指定位置から末尾までの部分文字列を取得 |
| 30 | Substring(startIndex, length) - 指定位置から指定長さの部分文字列を取得 |
実用的な使用例
文字列比較
string str1 = "This is test";
string str2 = "This is text";
if (String.Compare(str1, str2) == 0) {
Console.WriteLine("等しい");
} else {
Console.WriteLine("等しくない"); // こちらが実行
}
部分文字列の含有チェック
string str = "This is test";
if (str.Contains("test")) {
Console.WriteLine("'test' が見つかりました");
}
部分文字列の取得
string str = "Last night I dreamt of San Pedro";
string substr = str.Substring(23); // "San Pedro"
Console.WriteLine(substr);
文字列の結合
string[] lines = {
"Down the way nights are dark",
"And the sun shines daily on the mountain top",
"I took a trip on a sailing ship"
};
string joined = String.Join("\n", lines);
Console.WriteLine(joined);
文字列の不変性と StringBuilder
重要:C#のstringは不変(immutable)です。文字列を変更する操作(連結、置換、削除など)は、毎回新しい文字列オブジェクトを作成します。
大量の文字列操作を行う場合は、System.Text.StringBuilderを使用するとパフォーマンスが大幅に向上します。
using System.Text;
StringBuilder sb = new StringBuilder();
for (int i = 0; i < 1000; i++) {
sb.Append(i).Append(", ");
}
string result = sb.ToString();
文字列補間(C# 6.0以降)
String.Formatより読みやすい文字列補間を使用できます。
string name = "太郎";
int age = 25;
string message = $"名前: {name}, 年齢: {age}歳"; // "名前: 太郎, 年齢: 25歳"
// 書式指定も可能
double price = 1234.5;
string formatted = $"価格: {price:C}"; // "価格: ¥1,235"(カルチャ依存)
ベストプラクティス
- 単純な連結は
+や補間、複雑/大量はStringBuilderを使用 - nullチェックには
string.IsNullOrEmpty()またはstring.IsNullOrWhiteSpace()を使用 - 大文字小文字を区別しない比較には
String.Equals(a, b, StringComparison.OrdinalIgnoreCase)を使用 - カルチャ依存の操作(ToUpper/ToLower等)では
CultureInfoを明示的に指定することを検討 - 正規表現が必要な複雑なパターンマッチングには
System.Text.RegularExpressions.Regexを使用
C言語
- C# クラスとオブジェクト:堅牢な OOP の基礎
- C# 文字列をマスターする:基礎、操作、高度なテクニック
- C++文字列関数をマスター:strcpy、strcat、strlen、strcmpの実践例
- C 言語の文字列をマスター: 宣言、入力、出力、ライブラリ関数
- Python文字列操作マスター:replace、join、split、reverse、大文字小文字変換
- Java文字列をマスター:生成、メソッド、ベストプラクティス
- Javaシングルトンパターン完全解説:安全な実装と活用法
- Java Enumの文字列表現マスター:デフォルト、オーバーライド、高度なパターン
- Java Stringクラス完全ガイド:生成、操作、主要メソッド46選
- Javaオブジェクト直列化: オブジェクトの持続化と復元(Serializable/transient/ObjectOutputStream)
- Java 8概要:関数型、ストリーム、日時APIなどの新機能