2009-06-25 2 views
7

Я сейчас застрял в «продвинутом» классе ASP.NET, и мой инструктор только что высказал мнение, о котором я не уверен. (Я говорю «продвинутый», потому что он по-прежнему использует HTML-таблицы для макета страницы, и мы просто говорили о невероятно продвинутой теме «Мастер-страницы». Мне нужен глазной отбеливатель!)Структуры классов Vs в .NET Business Layer

Он утверждает, что вместо, скажем, создания класса Person который содержит все применимые данные и методы, вы должны создать как класс Person, так и класс Person. Структура содержит то, что обычно является свойствами класса Person, а класс содержит только методы. Поскольку структура Person находится в стеке, данные, связанные с вашим человеком, уходят, как только ваш метод или что-то выскочит из стека, а не мусор, собранный в кучу, как с объектом.

Предполагается сохранить память и ускорить процесс сбора мусора.

Вопрос: насколько большой эффект может это произвести и действительно ли это стоит?

+4

Это ваш инструктор: прекратите переполнение стека в классе и обратите внимание! –

+2

Мы были на ланч, честно! –

+1

Почему бы просто не использовать Structs? Вы можете иметь методы в Struct точно так же, как класс. – RBarryYoung

ответ

7

Существует несколько проблем с аргументацией, представленной для шаблона, который вы описываете.

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

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

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


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

Кроме того, конкретный случай использования структуры как объекта DTO кажется ошибочным, поскольку он вводит излишнюю избыточность. Поскольку structs не может наследовать другие структуры, вы не можете выразить is-a отношения. Что вы делаете, когда у вас есть Клиент, который наследует от Лица. Повторяете ли вы все свойства Person в структуре Customer? Вы встраиваете структуру Person внутри структуры Customer? Ни один подход не идеален. Если вы, по крайней мере, использовали классы, вы могли бы продлить действие Клиентом.

+0

Отличный ответ, я думал, что это заслуживает больше, чем голосование :) – KOTJMF

10

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

Похоже, ваш профессор выступает за использование data transfer objects, что будет способствовать разделению состояния и поведения. Это может быть хорошим дизайном, если все сделано правильно (и в большинстве случаев вы реализуете этот шаблон, используя классы, а не структуры).

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

0

Честно говоря, я впервые услышал об этом подходе.

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

MSDN, where Microsoft has published structure design guidelines.

Классы, как ваш инструктор говорит о воле легко простираться мимо правила 16 байт. И трудно увидеть структуру такого рода, не инкапсулирующую бизнес-(или, по крайней мере, проверку) правила в свойствах. На мой взгляд, это был бы довольно дрянной дизайн.

-2

Проблема с этим подходом заключается в том, что объекты (экземпляры классов) имеют изменяемое состояние. Структуры в противоположность должны быть неизменными, то есть они не имеют состояния, которое можно изменить. В типичном приложении бизнес-уровень в значительной степени использует изменение состояния объекта (т. Е. Рабочих процессов, проверки и т. Д.).

Преимущества, которые он описывает, не оправдывают недостатков, которые это принесет.

+0

Структуры неизменны и не имеют состояния? С каких пор? – jalf

+0

@jalf Извините, что я хотел сказать «должно быть». Ввод слишком быстро = P Спасибо за улов! – Joseph

+0

Структуры не являются (автоматически) неизменяемыми. Они обычно должны быть, но это требует усилий. –

2

Это звучит довольно глупо для меня. Я не уверен, сколько запасов я бы поставил в кодировании совета того, кто использует таблицы для размещения в HTML. Если бы это была техника, которая принесла значительные преимущества, это была бы стандартная практика. Это не так. Это первый раз, когда я слышал об этой технике.

+7

Мои навыки HTML тоже ужасны, но я не думаю, что это отражается на моем C#. –

+1

Он учит HTML-классу и учит худшим практикам. Мои навыки html тоже довольно дерьмовые, но я не учу других людей. Это не значит, что это будет забавно - просто, если кто-то учит занятиям, использующим худшие практики, для чего-то, возникает вопрос о том, чему они учат. –

+1

Он учит ASP.NET, а не HTML. Допустим, это требует некоторых навыков HTML. Но в небольшой демо-версии

макет может быть оправданным, если вы упомянули CSS и DIV. –

1

Независимо от того, эффективна ли эта стратегия, с ней будет труднее работать, и я попытаюсь ее избежать. При этом я сомневаюсь, что это будет более эффективно. Если бы это было так, то компилятор, вероятно, выполнил бы это автоматически. В целом безопасно полагаться на компилятор для оптимизации на уровне языка.

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