C#
 Computer >> コンピューター >  >> プログラミング >> C#

C#のSystem.StringクラスとSystem.Text.StringBuilderクラスの違いとは?どちらを使うべきか解説

主な違い:Stringは「不変」、StringBuilderは「可変」

C#におけるSystem.StringクラスとSystem.Text.StringBuilderクラスの最大の違いは、StringBuilderが可変(ミュータブル)であるのに対し、Stringが不変(イミュータブル)であるという点です。

Stringクラス(不変・Immutable)

Stringは不変(immutable)な型です。つまり、一度文字列オブジェクトを作成すると、その内容を後から変更することはできません。文字列に対して何らかの変更操作を行うと、毎回メモリ上に新しい文字列オブジェクトが生成されます。

StringBuilderクラス(可変・Mutable)

一方、StringBuilderは可変(mutable)な型です。StringBuilderオブジェクトを作成しておけば、挿入(Insert)・置換(Replace)・追加(Append)といった操作を、その都度新しいインスタンスを生成することなく実行できます。文字列はメモリ上の同じ場所で更新されるため、新たなメモリ領域を確保する必要がありません。

サンプルコード

using System;
using System.Text;
class DemoApplication{
    public static void Main(String[] args){
        String systemString = "Hello";
        StringConcat(systemString);
        Console.WriteLine("String Class Result: " + systemString);
        StringBuilder stringBuilderString = new StringBuilder("Hello");
        StringBuilderConcat(stringBuilderString);
        Console.WriteLine("StringBuilder Class Result: " + stringBuilderString);
    }
    public static void StringConcat(String systemString){
        String appendString = " World";
        systemString = String.Concat(systemString, appendString);
    }
    public static void StringBuilderConcat(StringBuilder stringBuilderString){
        stringBuilderString.Append(" World");
    }
}

出力結果

上記サンプルコードの出力は以下の通りです。

String Class Result: Hello
StringBuilder Class Result: Hello World

コードの解説

  • StringConcatメソッドの場合:このメソッドには文字列「Hello」が渡され、「systemString = String.Concat(systemString, appendString);」(appendStringは「 World」)によって連結処理が行われます。しかし、Main()から渡された元の文字列は変更されていません。これはStringが不変(immutable)であるためです。文字列の値を変更しようとすると新しいオブジェクトが生成され、StringConcat()内のsystemStringは新しい文字列への参照を保持します。そのため、Main()内のsystemStringとStringConcat()内のsystemStringは、それぞれ異なる文字列を参照していることになります。

  • StringBuilderConcatメソッドの場合:このメソッドにも文字列「Hello」が渡されますが、「stringBuilderString.Append(" World");」を実行すると、Main()側の実際の文字列の値が「Hello World」に書き変わります。これはStringBuilderが可変(mutable)であり、自身の値を直接変更できるためです。

使い分けのポイント

パフォーマンスの観点からも、両者の使い分けは重要です。

  • Stringが適しているケース:連結する回数が少ない場合や、文字列を頻繁に変更しない場合は、シンプルで読みやすいStringで十分です。
  • StringBuilderが適しているケース:ループ処理内での大量の文字列連結など、同じ文字列を繰り返し変更する場合は、StringBuilderを使用することで不要なオブジェクト生成を抑えられ、メモリ効率と処理速度が大幅に向上します。

このように、どちらが優れているかは一概には言えず、用途に応じた使い分けがベストプラクティスとなります。

  1. ノートパソコン vs デスクトップPC:どちらを選ぶべき?徹底比較ガイド

    ノートパソコン vs デスクトップPC。この比較は多くの人を悩ませるテーマです。「高額なデスクトップPCにお金をかけるのは不安」「ノートパソコンで本当に必要な作業がこなせるのか分からない」といった声は少なくありません。この記事では、性能・携帯性・価格などの観点から両者を徹底的に比較し、あなたに最適な選択ができるよう解説します。 ノートパソコンとデスクトップPCの最大の違いとは? 両者の最も大きな違いは「持続的な性能」にあります。デバイスのサイズを見れば自明ですが、ノートパソコンは小型であるため、デスクトップPCレベルの冷却システムを搭載することは物理的に不可能です。 とはいえ、近年のソフトウェ

  2. Android TVとRoku TV徹底比較!どちらのスマートTVプラットフォームが自分に合っている?

    Android TVとRoku TVは、どちらもテレビをスマート化するプラットフォームとして基本的に同じ役割を果たしますが、ユーザーの使い方によって向き不向きが変わってきます。 Roku TVは技術的な知識がない方や、初めてスマートTVを使う方に最適です。一方、Android TVはゲーマーやヘビーユーザーにとってより良い選択肢となります。 この記事では、「Android TV vs Roku TV」の違いを7つの観点から詳しく解説し、どちらのスマートTVプラットフォームが自分に合っているのかを判断できるようサポートします。それでは、各機能を順番に見ていきましょう。 Android TV