использовать БОЛЬШЕ структуры? - PullRequest
4 голосов
/ 30 октября 2009

За последние несколько дней было несколько вопросов о правильном использовании null ; вот три (один мой):

При чтении и размышлении над этой проблемой у меня возникла мысль: почему бы не использовать struct вместо class? (Затем я прочитал несколько вопросов об этом.)

Одно большое преимущество struct (в данном контексте) состоит в том, что не может быть нулевым , поэтому нет необходимости проверять null. И в качестве дополнительного бонуса, если вы действительно хотите ноль struct, вы можете сделать это тоже с некоторым дополнительным синтаксисом (T?) и типом Nullable<>. (Слишком плохие ссылочные типы тоже не сработали!)

Но struct s передаются по значению, которое убивает производительность. Ну, во-первых, код должен быть «правильным» (что бы это ни значило ), а затем быстро. Однако есть несколько способов избежать этих накладных расходов, где это действительно важно: ref параметры, обнуляемые параметры, поместите struct в некоторый другой класс, скажем List<>.

Правда, с struct s вы не можете создать иерархию классов, но «наследование перерасходуется». И вы можете реализовать интерфейсы.

Использование большего количества объектов на основе struct может упростить написание многопоточного кода.

Существуют ли еще более редко упоминаемые преимущества для struct с? Приходят ли какие-либо из этих соображений приблизиться к появлению вмятины в "огромном" старте "class?

Ответы [ 3 ]

3 голосов
/ 30 октября 2009

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

1 голос
/ 30 октября 2009

Большим ограничением (ИМО) struct является то, что оно должно быть неизменным.

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

0 голосов
/ 30 октября 2009

Если вы начнете использовать структуры в сценариях слабых типов (например, при присваивании типу объекта) Object o = structValue; или Object o = new mystruct(); или Object o = default(mystruct); и т. Д., Значения помещаются в кучу и также распаковываются при использовании. Это потенциальный недостаток, поскольку он влияет на производительность. См. Информацию от Microsoft о упаковке и распаковке .

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