2009-11-30 2 views
1

Я где-то читал, хотя я не могу вспомнить, где, используя ключевое слово lock в C#, можно выделить.Блокирует ли выделение

Я знаю, что попытка блокировки ValueType будет включать в себя тип valuetype, но есть ли другие ситуации?

EDIT ::

  1. Все, кажется, ответить на случай ValueType, я уже знаю, что это!
  2. Я также знаю, что замки и , как использовать их в большой глубине, общие рекомендации по лучшей практике приятно - но бесполезно;)
  3. мне нужно знаю, потому что я строю приложение XNA для развертывания на xbox. Xbox сборщик мусора очень медленно - это означает, что мне нужно держать распределения к минимуму, предпочтительно несуществующими (что предотвращает коллектор из когда-либо работал)

ответ

1

Хотя выделение см синхронизации блока внутренне ленив (но это деталь реализации, которую IIRC я ​​знаю из Essential.NET «том 1», или это CLR через C#), и ее следует рассматривать как именно это), простой случай элемента, который должен быть помещен в коробку, как вы Рекомендация не возникает - см. Why lock(<integer var>) is not allowed, but Monitor.Enter(<integer var>) allowed?

+0

Хорошо, что подтверждает, что блокировка типа значения * делает * выделение, но как насчет блокировки ссылочного типа? – Martin

+0

@Martin: 1. вы не можете заблокировать тип значения - вам нужно будет установить его в поле и «заблокировать окно». 2. Что касается ссылок, он выделяет что-то внутренне [которое равно null до его необходимости], но это не объект .NET, это внутренняя структура, которой владеет CLR. Вы не должны видеть влияние в профилировщике .NET, например, хотя использование mem на родном уровне может быть затронуто. Что подводит нас к тому, «что вам нужно знать»? –

+0

обновлено новой информацией – Martin

1

Если вы подумывали использовать:

замок (это)

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

замок (TypeOf (MyClass))

Если вы не хотите, чтобы это сделать, вы можете легко выделить статический или экземпляр объекта (т.е. объекта myLock = new object()), а затем заблокируйте его.

Source

Что касается блокировки на ссылочного типа против типа значения, этот SO question on Locking a resource when obtained... есть ответ:

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

Определение заявления замка:

замок Заявление (C#)

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

SO question on lock keyword in C# может помочь. Вы также можете посмотреть на Why lock() is not allowed, but Monitor.Enter() allowed?

Спецификации для компилятора определяет behavior of lock like so:

Компиляция типа время выражения заявления блокировки должен быть ссылочным типа или> типа параметра (§25.1.1), который известен как ссылочный тип . Это ошибка компиляции для типа времени компиляции выражения для обозначения типа значения.

+0

Это говорит мне много общей информации о замках. Но он по-прежнему не отвечает на реальный вопрос. Я хочу знать, выделяет ли замок * при блокировке ссылочного типа *. Если вы прочтете мой вопрос, я сказал, что я уже знаю * о типах значений блокировки: P – Martin

+0

@Martin: Я не могу найти ничего, что говорит об этом. – 2009-11-30 15:15:12