Что занимает больше памяти?
Итак, вы спрашиваете о размере представления в памяти . .net использует UTF-16 для строк, что означает, что ваш пример будет представлен 14 байтами, как видно из этого шестнадцатеричного дампа (UTF-16LE):
4d 00 79 00 20 00 54 00 65 00 78 00 74 00
Размер байтового массива будет зависеть от кодировки , которую вы используете для представления текста. Если вы используете UTF-16 , как это
Encoding.Unicode.GetBytes(string)
вы, очевидно, получаете те же 14 байтов. Если вы используете UTF-8 вместо:
Encoding.UTF8.GetBytes(string)
вы получите массив из 7 байтов:
4d 79 20 54 65 78 74
Это тот же размер (и то же представление), что и ASCII , поскольку в вашем примере используются только те символы, которые доступны в кодировке ASCII. Все эти символы, по определению, одинаковы в UTF-8.
Теперь, если вместо этого вы используете не-ASCII-символов , скажем, японское «日», для кодировки UTF-8 потребуется 3 байта:
e6 97 a5
UTF-16 потребуется только 2 байта:
e5 65
Попытка преобразовать японский символ в ASCII приведет к исключению или просто использовать "?" символ, в зависимости от того, как вы настроили Encoding
, потому что ASCII не может представлять ничего, кроме символов ASCII.
Еще один немного другой пример, европейский символ "ä". 2 байта в UTF-8:
c3 a4
Также 2 байта в UTF-16:
e4 00
ASCII не может представлять этот символ.
Подводя итог, используемая память зависит от фактических данных в ваших строках и от того, какую кодировку вы используете для их представления .
Все вышесказанное говорит о потреблении памяти только для необработанных данных , обратите внимание, что для расчета общего потребления памяти вам также необходимо включить метаданные , которые являются частью каждого массива и строки, например, длина , а в случае строк .net также нулевой терминатор (2 дополнительных байта со значением '0'). Количество байтов для метаданных является постоянным и относительно небольшим, поэтому любая разница между строкой и массивом будет иметь значение только при наличии тонны очень маленьких текстов.