C # управление строками в структурах - PullRequest
25 голосов
/ 17 февраля 2012

Я знаю, что строки имеют переменную длину, поэтому им необходимо переменное пространство в памяти для хранения. Когда мы определяем строковый элемент в struct, размер struct будет иметь переменную длину.

Старые языки справились с этим с помощью строк фиксированной длины. Тем не менее, нет никакого способа определить строки фиксированной длины в C #, и C # управляет обычными строками в struct довольно хорошо.

Это становится более странным, когда мы определяем массив таких struct s или просто массив строк. В результате любого изменения (уменьшения / увеличения) длины одной строки все передовые значения struct s должны быть сдвинуты.

Как C # обрабатывает строки переменной длины в структурах?

Ответы [ 5 ]

45 голосов
/ 17 февраля 2012

Ссылка на строку (которая не является типом значения) сохраняется в структуре, поэтому размер структуры никогда не изменяется.

11 голосов
/ 17 февраля 2012

Мой первый вопрос к вам будет, диктуют ли ваши требования необходимость строки фиксированной длины? Если это так, то символ [] действительно может быть тем, что вы намереваетесь использовать.

.NET Framework не использует строки в стиле C (массивы символов) напрямую, а вместо этого представляет строки с помощью неизменяемых ссылок. Когда строка добавляется или изменяется, вы фактически создаете новый строковый объект в памяти. Это желаемая особенность платформы, но она требует рассмотрения, так как ожидание магического изменения размера струн может привести к нежелательным побочным эффектам.

Вернуться к вашему вопросу. «Как C # управляет строками в структурах?»

Один из двух способов интерпретировать этот вопрос из того, что я вижу:

1). Как я могу создать структуры, содержащие строки, и как .NET Framework управляет строками в этом сценарии?

Краткий ответ: имейте в виду, что строки являются неизменяемыми типами. Создайте свою структуру как обычно и поймите, что структура содержит только ссылку на строку, а не магически изменяющийся сегмент структуры, который расширяется и включает вашу изменчивую строку.

2). Как .NET Framework может изменять размеры строк, если они представляют собой тип значения, представленный структурами.

Краткий ответ, это не так. Это не то, как .NET работает со строками, см. Выше.

7 голосов
/ 17 февраля 2012

+ 1 к jjlin для краткого и точного ответа на вопрос, но может быть полезен более общий ответ:

Объявление поля или переменной любого ссылочного типа представляет хранилищеlocation для ссылки. Это также верно для полей структуры.

(Включение полей ссылочного типа в структуру делает этот тип "управляемым типом", что важно в небезопасныхкод; вы не можете объявить указатель на управляемый тип.)

2 голосов
/ 17 февраля 2012

C # управляет строками в структурах так же, как и строками в целом. См:

0 голосов
/ 06 ноября 2016

Сохранение структуры в стеке и хранение строк в куче.

То же, что примитивные типы сохраняются в стеке, а ссылочные типы сохраняются в куче.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...