C#: Какой стиль контейнеров данных предпочтены в целом?

Я работал с двумя из этих форматов на l18n стороне: TMX и XLIFF. Они довольно подобны. TMX более популярен в наше время, но XLIFF получает поддержку быстро. Был по крайней мере один свободный редактор XLIFF, когда я в последний раз изучил его: Transolution, но это не разрабатывается теперь.

13
задан 2 revs 13 July 2009 в 14:00
поделиться

8 ответов

Почти всегда класс; структуры действительно должны использоваться только для тех вещей, которые являются значениями - например, комплексным числом или парой типа валюты / значения - и должны почти -без исключения быть неизменными.

Конструктор без параметров удобен для изменяемых данных, если вы собираетесь выполнять привязку данных, поскольку это позволяет системе создавать экземпляры без дополнительного кода от себя. Непустой конструктор очень важен для неизменяемых данных. Для изменяемых данных инициализатор объекта проходит долгий путь к этому (хотя не совсем то же самое с точки зрения проверки и т. Д.):

var obj = new Person {Name="Fred", DateOfBirth=DateTime.Today};

Являются ли ваши типы неизменяемыми - решать вам; mutable упрощает привязку данных и сериализацию. В общем, вы склонны видеть больше изменяемых типов в .NET,

11
ответ дан 1 December 2019 в 23:48
поделиться

Пара замечаний по классам и структурам:

Классы передаются по ссылке, что означает, что один и тот же объект-экземпляр передается между функциями. Если вы создаете MyClass в методе A и вызываете метод B, метод B изменяет класс и ничего не возвращает методу A, метод A видит изменения, сделанные в MyClass, поскольку они относятся к одному и тому же объекту. Ссылка обычно представляет собой int32, поэтому независимо от размера вашего класса будет быстро вызвать метод B, потому что он передает только 4 байта. Классы полагаются на сборщик мусора, чтобы решить, когда он больше не используется (меньшие накладные расходы при передаче класса, но добавляют накладные расходы сборщику мусора).

Структуры передаются по значению (или типу значения). Это означает, что вся структура копируется при передаче. Если ваша структура большая, это займет много времени. Изменение структуры в методе B не будет отображаться в методе A, если оно не будет возвращено (опять же, это требует времени, поскольку оно передается по значению), а метод A считывает возвращаемое значение. Структуры создаются в стеке и не имеют накладных расходов на сборку мусора (вы можете увидеть это, если изучите свой IL-код).

В структурах существует множество ограничений по сравнению с классами, например, отсутствие виртуальных методов и других полиморфных функциональность.

Лучше отдавать предпочтение классам, если только вы не собираетесь быстро создавать и отбрасывать множество объектов одним и тем же методом (которые истощают системные ресурсы из-за сборки мусора), и в этом случае предпочтение отдается структурам.

1
ответ дан 1 December 2019 в 23:48
поделиться

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

В остальном, я думаю, это сводится к личные или командные предпочтения и ваши особые требования.

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

2
ответ дан 1 December 2019 в 23:48
поделиться
  • Вы почти всегда должны предпочитать классы структурам. Используйте структуры только тогда, когда объект представляет (неизменяемое) значение.

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

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

3
ответ дан 1 December 2019 в 23:48
поделиться

Я обычно создаю неизменяемые классы, все значения которых устанавливаются / передаются через конструктор.

0
ответ дан 1 December 2019 в 23:48
поделиться

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

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

0
ответ дан 1 December 2019 в 23:48
поделиться

На самом деле кажется, что почти все временные структуры - ненужное отвлечение от простоты и эффективности классов.

0
ответ дан 1 December 2019 в 23:48
поделиться

Также существует эмпирическое правило, согласно которому размер структуры не должен превышать 16 байт - размер строки кэша процессора.

0
ответ дан 1 December 2019 в 23:48
поделиться
Другие вопросы по тегам:

Похожие вопросы: