Für alle zu diesem späten Thema kommen, könnte ich das hitscan sehen, „sollten Sie wahrscheinlich nicht tun, dass“ jemand fragen verursachen könnten, was sie tun sollten ...
DIe StringBuilder Klasse ist oft ein einfacher Ersatz. Betrachten Sie eine der stream-based classes vor allem, wenn Ihre Daten aus einer Datei stammen.
Das Problem mit s = s + "stuff" ist, dass es einen komplett neuen Bereich zuweisen muss, um die Daten zu halten und dann alle alten Daten plus das neue Zeug - JEDER LOOP ITERATION. Das Hinzufügen von 5 Bytes zu 1 Million mit s = s + "stuff" ist extrem teuer. Wenn Sie nur 5 Bytes zum Ende schreiben und mit Ihrem Programm fortfahren möchten, dann müssen Sie eine Klasse auswählen, die etwas Raum für Wachstum lässt.
StringBuilder sb = new StringBuilder(5000);
for (; ;)
{
sb.Append("stuff");
}
Stringbuilder wird auto-grow by doubling wenn es Grenze getroffen wird. So werden Sie den Wachstumsschmerz einmal beim Start sehen, einmal bei 5000 Bytes, wieder bei 10000, wieder bei 20000. Beim Anhängen von Strings treten bei jeder Schleifeniteration die Schmerzen auf.
Dies ist die richtige Antwort. Es ist wahrscheinlicher, dass Ihnen der Speicher ausgeht, bevor Sie genügend Speicherplatz zuweisen können, um die Zeichenfolgenlänge zu nutzen. Bei einem Neustart können Sie möglicherweise eine Zuweisung von 2 GB (mit 1 Mio. Zeichen) wie hier erwähnt abrufen, aber das ist alles. –
Unter der Annahme, dass Ihre Behauptung "kein einzelnes Objekt kann über 2 GB sein" korrekt ist, ist dies sowohl die theoretische als auch die praktische Grenze - die Einschränkung für die Stringlänge wäre die gesamte Objektgröße, nicht die Kapazität des Längenfelds. – McKenzieG1
Wenn sich jemand für den genauen Wert interessiert, sind es auf meinem 64-Bit-Gerät 1.073.741.791 (1024 · 1024 · 1024 - 33) Zeichen. Siehe auch [meine verwandte Frage über die genaue maximale Größe von 'byte []'] (http://stackoverflow.com/q/6616739/41071). – svick