о том, что память быстрее / лучше:
Я рассмотрел эту проблему с Java, я полагаю, что .NET будет настолько же умен в этом.
Реализация для String довольно впечатляющая.
Объект String отслеживает «length» и «shared» (независимо от длины массива, в котором находится строка)
Так что-то вроде
String a = "abc" + "def" + "ghi";
может быть реализовано (компилятором / средой выполнения) как:
- Extend the array holding "abc" by 6 additional spaces.
- Copy def in right after abc
- copy ghi in after def.
- give a pointer to the "abc" string to a
- leave abc's length at 3, set a's length to 9
- set the shared flag in both.
Поскольку большинство строк недолговечны, во многих случаях это дает ОЧЕНЬ эффективный код.
Случай, когда он абсолютно НЕ эффективен, это когда вы добавляете строку в цикл или когда ваш код выглядит так:
a = "abc";
a = a + "def";
a += "ghi";
В этом случае вам гораздо лучше использовать конструкцию StringBuilder.
Я хочу сказать, что вы должны быть осторожны при оптимизации, если только вы не абсолютно уверены, что знаете, что делаете, И абсолютно уверены, что это необходимо, и проверяете, чтобы оптимизированный код прошел проверку, просто закодируйте его наиболее читаемым способом и не пытайтесь перехитрить компилятор.
Я потратил 3 дня на то, чтобы возиться со строками, кэшировать / повторно использовать сборщики строк и скорость тестирования, прежде чем я посмотрел на исходный код строки и обнаружил, что компилятор уже делал это лучше, чем я, возможно, мог для моего случая использования. Затем мне пришлось объяснить, как я ДЕЙСТВИТЕЛЬНО не знал, что я делаю, я только думал, что знаю ...