Вы спрашиваете, сколько памяти stringзанимает объект или сколько байтов будет занимать представление строки при записи в файл или отправке по сети (т. Е. При кодировании), потому что это два совершенно разных вопроса. Маджиджик почти ответил на первое, а дийа ответил на второе (по крайней мере, для двух распространенных кодировок).
@AllonGuralnek: Хороший вопрос. знаете ли вы, почему дия ниже не предлагала вместо этого использовать System.Text.Encoding.Unicode.GetByteCount? Почему именно ASCIIEncoding?
giorgim
@Giorgi: Поскольку Unicodeэто статическое свойство System.Text.Encoding, которое является базовым классом ASCIIEncoding, оба оператора фактически одинаковы. Вы также можете получить доступ к статическому члену из подклассов (но это не считается идиоматическим).
Аллон Гуралнек
Ответы:
132
Вы можете использовать кодировку, такую как ASCII, чтобы получить символ на байт с помощью System.Text.Encodingкласса.
Глупый вопрос, но как мы узнаем, использовать ли класс Unicode или ASCII, если данные в строке пришли из стороннего файла?
Мэтью Лок,
7
@MatthewLock Вы должны использовать UTF16 (или majidgeek Length * sizeof(Char), который должен дать тот же результат, поскольку каждый из них Charимеет размер UTF16 / 2 байта), если вы хотите такое же количество байтов, что и внутреннее представление строки. Если вам действительно нужен точный объем памяти, который занимает весь объект, а не просто количество байтов в его внутреннем массиве символов, вы можете рассмотреть более общий метод .
Насколько я могу понять основы структуры данных, это самый «скучный» выбор для сравнения
LoneXcoder
2
Не забудьте учесть размер элемента длины. int howManyBytes = yourString.Length * sizeof (Char) + sizeof (int);
Золтан Тиринда
Что делать, если длина моей строки больше, чем Int?
Юрий Кастанов
Это должен быть правильный ответ. Также .Length - это количество байтов, которое получит сервер, если вы отправите ту же строку. Это то, что мне было нужно.
string
занимает объект или сколько байтов будет занимать представление строки при записи в файл или отправке по сети (т. Е. При кодировании), потому что это два совершенно разных вопроса. Маджиджик почти ответил на первое, а дийа ответил на второе (по крайней мере, для двух распространенных кодировок).Unicode
это статическое свойствоSystem.Text.Encoding
, которое является базовым классомASCIIEncoding
, оба оператора фактически одинаковы. Вы также можете получить доступ к статическому члену из подклассов (но это не считается идиоматическим).Ответы:
Вы можете использовать кодировку, такую как ASCII, чтобы получить символ на байт с помощью
System.Text.Encoding
класса.или попробуйте это
источник
Length * sizeof(Char)
, который должен дать тот же результат, поскольку каждый из нихChar
имеет размер UTF16 / 2 байта), если вы хотите такое же количество байтов, что и внутреннее представление строки. Если вам действительно нужен точный объем памяти, который занимает весь объект, а не просто количество байтов в его внутреннем массиве символов, вы можете рассмотреть более общий метод .Из MSDN :
Итак, вы можете использовать это:
источник
Или
источник