2012-02-17 2 views
22

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

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

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

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

+2

C# не является C - вы считаете, что память управляется одинаково в обоих случаях. – Oded

+0

Да ... Моя вина. –

ответ

37

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

+1

+1 Очень краток! – Candide

+0

Вы имели в виду "Is value type"? – Krythic

+0

Нет, строка не является [значением типа] (https://msdn.microsoft.com/en-us/library/s1ax56ch.aspx). – jjlin

5

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

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

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

9

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

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

Назад к вопросу. «Как C# управляет строками в структурах?»

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

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

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

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

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

+1

Спасибо, Фиросо. Нет, я доволен струнами. Меня просто беспокоила сложная сложность операций над структурами и массивами строк. Теперь я знаю трюк: «Ссылка на строку». –

+0

Если вы обеспокоены эффективностью сильных манипуляций и мутаций, рассмотрите возможность использования класса StringBuilder. – Firoso

-5

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

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

Смежные вопросы