2016-05-11 6 views
1

不変の文字列に関する研究をしていて、オブジェクトが作成された後に文字列オブジェクトの内容を変更できないことを理解しています。c#不変の文字列が常に更新される

タイマースレッドがループするたびに更新される何らかの「ステータス」オブジェクトを常に更新するオブジェクトが必要です。

私の質問は、このようなオブジェクトには何が使えますか?

StringBuilderは連結が必要な文字列がたくさんある場合に有効ですが、値を追加する代わりに効率的に値を変更することができます。

カスタム列挙型を使用できますか?

get set accessorsを持つ文字列プロパティを持つカスタムクラスはどうですか?もう一度文字列プロパティは不変です - または間違っていますか?ここで

は、いくつかのサンプルコードです:

string status = "IDLE"; 

System.Threading.Timer timer = null; 
System.Threading.TimerCallback callback = new System.Threading.TimerCallback(delegate 
{ 
    status = getStatus(); 

    timer.Change(100, Timeout.Infinite); 
}); 
timer = new System.Threading.Timer(callback, null, 0, Timeout.Infinite); 
+1

を使用することができ、あなたは、ガベージコレクションを心配することはありません(まったく明白な状況を除いて) – kai

+0

文字列オブジェクトは不変です。つまり、文字オブジェクトの一部の文字を置き換えることはできません。これで、変数、フィールド、またはプロパティに異なる文字列を割り当てることはできません。 'string a =" foo "; a = "bar"は完璧です。 'a'は文字列への参照なので、実際には別の文字列を指すだけです。 –

+0

したがって、文字列が作成されると、文字列が変更されたときにその文字列の参照のみが変更されるため、文字列がその場所を保持します(新しいメモリを持つ新しい文字列は作成されません)。 – langjacques

答えて

1

文字列は不変であっても、あなたはプロパティ/属性/フィールドに格納するもの、文字列そのものではなく、文字列への参照ではありません。

これは、いつでも参照を置き換えることができることを意味します。

は、あなたの質問に答えるために:あなたは完全にあなたが専門性の高いソフトウェアを構築している場合を除き、タイトperformancecriticalループであるかを測定し、ボトルネックを特定し、C#では文字列

+0

通常の文字列やカスタムクラスの文字列プロパティを意味しますか? – langjacques

+0

どちらもうまくいくでしょう:) kai/PieterWitvoetが言ったように、あなたが非常に特定の状況にいない限り、毎回新しい文字列を作成する心配はありません。 – Sidewinder94

関連する問題