Heim > Artikel > Backend-Entwicklung > Detaillierte Erläuterung von Codebeispielen für spezielle Zeichenfolgentypen in C#
In diesem Artikel wird hauptsächlich der spezielle String-Typ von C# vorgestellt. Es hat einen sehr guten Referenzwert, schauen wir es uns mit dem Editor unten an
1 Vorwort
String ist ein Referenztyp, das weiß jeder, richtig ? Bei der Verwendung stelle ich jedoch fest, dass es immer noch einige Merkmale von Werttypen aufweist. Warum ist das so?
Der Grund dafür ist, dass .Net davon ausgeht, dass die Leistung definitiv nicht so schnell ist wie die des Werttyps, wenn eine große Anzahl von Zeichenfolgenobjekten und eine große Anzahl von Referenzobjekten manipuliert werden. Um diese Leistung zu verbessern, bietet .Net eine spezielle Lösung: String-Resident-Pool!
2. Text
Schauen wir uns zunächst einen Code an:
string str1 = "aa"; string str2 = "a" + "a"; Console.WriteLine(ReferenceEquals(str1, str2)); //print:true
Die Speicheradressen von str1 und str2 sind tatsächlich genau gleich!
Der Grund dafür ist, dass .Net eine Hash-Tabelle innerhalb der CLR (eigentlich der oben erwähnte String-Resident-Pool) verwaltet, der Schlüssel der String-Inhalt ist und der Wert die Adresse des verwalteten Heaps ist, auf den verwiesen wird initialisiert zum Erstellen Wenn eine neue Zeichenfolge erstellt wird, durchsucht .Net die Hash-Tabelle, um festzustellen, ob der Schlüssel derselbe ist. Der Adresswert der vorhandenen Zeichenfolge wird der neu erstellten Zeichenfolge zugewiesen Wenn dies nicht der Fall ist, wird der Adresswert der vorhandenen Zeichenfolge der neu erstellten Zeichenfolge zugewiesen. Wenn sie vorhanden ist, wird die Adresse neu zugewiesen, weshalb der Speicher des obigen Codes wahr ist.
Schauen wir uns einen weiteren Code an:
string str3 = "ab"; string str4 = "a"; str4 += "b"; Console.WriteLine(ReferenceEquals(str3, str4));//print :false
Der Grund, warum false angezeigt wird, achten Sie bitte auf die Schlüsselwörter im vorherige Spalte „Erste Erstellung“, wenn die Zeichenfolge dynamisch erstellt wird, durchsucht .Net nicht die Hash-Tabelle, um zu sehen, ob sie erstellt wurde, sondern erstellt sie direkt
Wenn Sie den obigen Code optimieren möchten und Verbessern Sie die Leistung. Wenn mehr (xian) höhere (de) Verfolgung (dan) Nachfrage (teng) besteht, können wir diese Zeichenfolge zum Vergleich manuell zum String-Resident-Pool hinzufügen
string str3 = "ab"; string str4 = "a"; str4 += "b"; str4 = string.Intern(str4);//Intern:它会去字符串驻留池中搜索,假如找寻到的话则返回对应的地址 Console.WriteLine(ReferenceEquals(str3, str4));//print :true
3. Zusammenfassung
Abschließend einige Schlussfolgerungen zum String:
1. String verwendet nicht die newobj-Anweisung in clr Erstellen, aber verwenden Sie zum Erstellen den Befehl ldstr! Darüber hinaus hat die Zeichenfolge die Eigenschaften eines Werttyps, ist jedoch ein Referenztyp im Speicher und existiert auf dem verwalteten Heap
2. daher kann es nicht subsumiert werden. Klassenintegration
3 Wenn der erstellte Inhalt derselbe ist, zeigt die Zeichenfolge auf dieselbe Adresse und jede Operation an der Zeichenfolge wird ausgeführt Generieren Sie eine neue Adresse (Konstanz des Strings).
4 Für eine große Anzahl von Spleißen ist es besser, StringBuilder zu verwenden ist konstant, aber die Erstellung von StringBuilder ist teurer, daher kann die Verwendung von String für kleine Spleißvorgänge im Hinblick auf die Leistung besser sein!
Das Obige ist die detaillierte Erläuterung der speziellen String-Typ-Codebeispiele in C#. Weitere verwandte Inhalte finden Sie unter PHP chinesische Website (www. php.cn)!