2011-08-09 14 views
5

私は最近、C#の可能System.String実装

string str = "u r awesome"; 
str[0]="i"; 

で次の操作を実行しようとしていたと明らかにstrの[i]は取得のみないように設定されているので、それが動作しない根本的なので、私は思っていたものを基本的な文字列の実装では、str [i]をgetするだけです。

char *の管理されたラッパーではありませんか?それではなぜ私はstr [i]を設定できませんか?

答えて

3

他の人が不変性に関して与えた答えはもちろん正しいものであり、あなたの持つ問題の "実際の"原因です。

あなたはここでは特に、基礎となる実装(とちょうど好奇心のうちであれば)について尋ね、そしてこの質問つまずくかもしれない他の人を基準としてので、そのトピックに関するいくつかのより多くの情報がEric Lippertからです:

".NET CLRでは、ストリングはOLEオートメーションでBSTRが実装された方法と同じようにメモリに配置されます 4バイト整数で構成されたメモリバッファーで、長さが の文字列2バイトの文字列の後にUTF-16データの チャンクが続き、その後に2バイトのゼロバイトが続きます。

ここで「かなり」の部分に注意してください。ただし、BSTR自体もEric's blogで説明しています。

あなたは、このすべてが実装の詳細とみなされるべきであることに気をつけてください。そして、私たちの大部分は本当に心配してはいけませんが、相互運用性の問題のデバッグや一般的な理解に役立ちます。

+0

これは実際に私が探していた答え、具体的にどのように文字列が実装されたか、感謝でした! – etk1220

8

.NET Stringクラスが不変であるため、文字列の文字を設定することはできません。つまり、その内容は作成後に変更できないことを意味します。これにより、同一の文字列インスタンスを何度も安全に使用することができ、1つのオブジェクトが他のオブジェクトがその文字列にぶつかることを心配することなく、安全に使用できます。

文字列を操作できる可変クラスが必要な場合は、代わりにStringBuilderを使用することを検討してください。

Cと比較したい場合、Stringタイプはconst char *のようなものですが、constをキャストすることはできません。 StringBuilderchar *(自動割り振りのサイズ変更あり)と同じようなもので、その内容から新しい独立したStringインスタンスを作成する方法(ToString())を使用します。

+0

関連:StringBuilderの内部構造の詳細http://stackoverflow.com/q/3564906/38206 –

2

cdhowieで答えたように、それはあなたが上にしたい場合は、提案として使用すると、以下のようにコンテナによって実装を模倣しようとすることができ、C/C++

内の文字列の概念に同じではありません

List<char> str = new List<char>("u r awesome"); 
str[0] = 'i'; 
str[2] = 'm'; 
Console.WriteLine(str.ToArray()); 
+2

文字列の構築を可能にすることが目的であるため、このためには 'StringBuilder'を使用する方がよいでしょう。 – cdhowie

+1

は完全に一致します。コードの提案は、本当に要素をインデックスで操作したい場合には、代わりの実装にどのようにetkを表示するかを試してみることです。 –

+3

'StringBuilder'はそれを可能にする[インデクサー](http://msdn.microsoft.com/en-us/library/system.text.stringbuilder.chars.aspx)を持っています。 :) – cdhowie

関連する問題