Подтвердить что ты не робот

Управление строками в структурах

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

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

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

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

4b9b3361

Ответ 1

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

Ответ 2

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

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

Вернемся к вашему вопросу. "Как С# управляет строками в структурах?"

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

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

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

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

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

Ответ 3

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

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

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

Ответ 4

С# управляет строками в структурах так, как он управляет строками вообще. См:

Ответ 5

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

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