のは、次のコードを実行してみましょう:
string s = "123";
string s2 = "234";
string s3 = s + s2;
string s4 = s2 + s3;
Console.WriteLine(s + s2);
それでは、最後の行にブレークポイントを入れて、メモリウィンドウを開いてみましょう:中s3
を書く
メモリウィンドウでは、2(s3
とs4
)文字列最初に4バイトのサイズで1つずつ割り当てられます。
また、strings
クラスタイプのトークンやその他のstring
クラスのデータなど、他のメモリが割り当てられていることがわかります。
string
class自体がstring
の長さが含まれているメンバーprivate int m_stringLength;
が含まれ、これはまたstring.Concat()
が(最初に全体の長さを割り当てることによって)超高速実行させる:
int totalLength = str0.Length + str1.Length + str2.Length;
String result = FastAllocateString(totalLength);
FillStringChecked(result, 0, str0);
FillStringChecked(result, str0.Length, str1);
FillStringChecked(result, str0.Length + str1.Length, str2);
私は少し奇妙見つける何string
のIEnumerable<char>.Count()
の実装は、がICollection<T>.Count
プロパティを使用して実装されているList<T>
のように、ICollection<T>
のようにアイテムを1つずつ反復することを意味するデフォルトの実装を使用して行われます。
あなたのCの仮定は間違っています。 Cコンパイラは**各文字列の長さを正確に**知っています。これを見るには、文字列の 'sizeof'を呼び出します(文字列の_pointerではなく!)。 – MSalters
通常、私は偽装としてこれを閉じますが、重複は悪いです。 http://www.codeproject.com/Articles/3377/Strings-UNDOCUMENTED – usr
@MSaltersあなたはコンセプトを混乱させています。配列と文字列は異なるエンティティで、それらにはそれぞれ異なる操作が関連付けられています。それらは関連していますが、それらは異なる抽象であり、混在させるべきではありません。 –