Lassen Sie sich den folgenden Code ausführen:
string s = "123";
string s2 = "234";
string s3 = s + s2;
string s4 = s2 + s3;
Console.WriteLine(s + s2);
nun einen Haltepunkt in der letzten Zeile setzen lassen und das Speicherfenster öffnen:
s3
in der Schrift Speicherfenster können wir die 2 sehen (s3
und s4
) str Diese werden am Anfang nacheinander mit 4 Bytes Größe belegt.
Sie können auch sehen, dass andere Speicher zugeordnet ist wie die strings
Klassentyp Token und andere string
Klasse Daten.
Die string
class selbst enthält ein Element private int m_stringLength;
, die die Länge der string
enthält, das macht auch string.Concat()
super schnell ausführen (durch die gesamte Länge am Anfang Zuteilung):
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);
Was finde ich ein wenig seltsam ist, dass die Implementierung von IEnumerable<char>.Count()
für string
unter Verwendung der Standardimplementierung durchgeführt wird, was bedeutet, Elemente nacheinander zu iterieren, im Gegensatz zu s wie List<T>
, wobei IEnumerable<char>.Count()
implementiert wird, indem seine ICollection<T>.Count
Eigenschaft genommen wird.
Ihre C-Annahme ist falsch. Ein C-Compiler weiß ** genau, wie lang jeder String ist. Um dies zu sehen, rufen Sie 'sizeof' auf der Zeichenkette auf (nicht auf einem _pointer to_ der Zeichenkette!). – MSalters
Normalerweise würde ich das als Dupe schließen, aber die Duplikate sind schlecht. http://www.codeproject.com/Articles/3377/Strings-UNDOCUMENTED – usr
@MSalter Sie sind Konzepte verwirrend. Arrays und Zeichenketten verschiedener Entitäten, denen verschiedene Operationen zugeordnet sind. Sie sind verwandt, aber sie sind unterschiedliche Abstraktionen und sollten nicht gemischt werden. –