Объекты выделяются на "куче"

LINQ к SQL вынуждает Вас использовать шаблон таблицы в классе. Преимущества использования этого шаблона - то, что это быстро и легко реализовать, и это прилагает очень мало усилий для получения домена, работающего на основе существующей структуры базы данных. Для простых приложений это совершенно приемлемо (и часто даже предпочтительно), но для более сложных приложений devs будет часто предлагать использовать домен управляемый шаблон дизайна вместо этого (который является тем, что NHibernate упрощает).

проблема с шаблоном таблицы в классе состоит в том, что Ваша структура базы данных имеет непосредственное влияние по Вашему доменному дизайну. Например, скажем, у Вас есть таблица Customers со следующими столбцами для содержания основной адресной информации клиента:

  • город StreetAddress
  • состояние
  • Zip

Теперь, скажем, Вы хотите добавить столбцы для почтового адреса клиента также, таким образом, Вы добавляете в следующих столбцах к таблице Customers:

  • MailingStreetAddress
  • MailingCity
  • MailingState
  • MailingZip

Используя LINQ к SQL, Потребительский объект в Вашем домене теперь имел бы свойства для каждого из этих восьми столбцов. Но если бы Вы следовали за доменом управляемый шаблон разработки, Вы, вероятно, создали бы Класс адресов и имели Ваш Потребительский класс, содержат два свойства Address, один для почтового адреса и один для их текущего адреса.

Это - простой пример, но он демонстрирует, как шаблон таблицы в классе может привести к несколько вонючему домену. В конце, Вам решать. Снова, для простых приложений, для которых просто нужен основной CRUD (создают, считайте, обновите, удалите), функциональность, LINQ к SQL идеален из-за простоты. Но лично мне нравится использовать NHibernate, потому что он упрощает более чистый домен.

Редактирование: @lomaxx - Да, пример, который я использовал, был упрощен и, возможно, был оптимизирован для работы хорошо с LINQ к SQL. Я хотел сохранить его максимально основным, чтобы убедительно доказать точку зрения. Точка остается, хотя это там - несколько сценариев, где наличие Вашей структуры базы данных решает, что Ваша доменная структура была бы плохой идеей, или по крайней мере привела бы к субоптимальному дизайну OO.

11
задан svick 17 April 2012 в 09:46
поделиться

3 ответа

Указатель объекта типа используется для представления типа объекта. Это необходимо для:

  • поиска метода (vtable)
  • проверки приведений
  • поиска объекта Type , если вы вызываете GetType .

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

Блок синхронизации также заполняется, если вы вызовите GetHashCode () , и он не переопределяется - в основном он использует таблицу для всего процесса для выделения стабильного номера. (Адреса объекта недостаточно, так как он может меняться со временем.)

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

Блок синхронизации также заполняется, если вы вызовите GetHashCode () , и он не переопределен - в основном, он использует таблицу для всего процесса для выделения стабильного номера. (Адреса объекта недостаточно, так как он может меняться со временем.)

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

Блок синхронизации также заполняется, если вы вызовите GetHashCode () , и он не переопределен - в основном, он использует таблицу для всего процесса для выделения стабильного номера. (Адреса объекта недостаточно, так как он может меняться со временем.)

17
ответ дан 3 December 2019 в 04:33
поделиться

Объект типа - это то, что возвращает obj.GetType call

блок синхронизации, используемый для синхронизации

См .:

4
ответ дан 3 December 2019 в 04:33
поделиться

Индекс блока синхронизации используется под капотом классом Monitor и, следовательно, оператором блокировки.

2
ответ дан 3 December 2019 в 04:33
поделиться
Другие вопросы по тегам:

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