Выделяет ли блокировка - PullRequest
       16

Выделяет ли блокировка

1 голос
/ 30 ноября 2009

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

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

EDIT ::

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

Ответы [ 2 ]

1 голос
/ 30 ноября 2009

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

блокировка (это)

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

блокировка (TypeOf (MyClass))

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

Источник

Что касается блокировки на ссылочный тип против типа значения , этот ТАК вопрос о блокировке ресурса при получении ... имеет ответ:

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

Определение оператора блокировки:

Заявление о блокировке (C # Reference)

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

Этот ТАК вопрос о ключевом слове блокировки в C # может помочь. Вы также можете посмотреть на Почему блокировка () не разрешена, но разрешена Monitor.Enter ()?

Спецификация для компилятора определяет поведение блокировки следующим образом: :

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

1 голос
/ 30 ноября 2009

В то время как внутреннее выделение блока see sync является ленивым (но это подробности реализации, которые IIRC знает из Essential.NET «том 1», или это CLR через C # - и должен рассматриваться именно так), простой случай, когда элемент должен быть упакован, как вы предполагаете, не возникает - см. Почему блокировка () не разрешена, а Monitor.Enter () разрешена?

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