Pergunta

Eu li em algum lugar, embora eu não me lembro onde, que o uso da palavra-chave de bloqueio em C # pode alocar.

Eu sei que a tentativa de bloquear um ValueType irá caixa do valuetype, mas existem outras situações?

EDIT ::

  1. Todos parece ser a resposta caso valuetype, eu já sei disso!
  2. Eu também sei o que bloqueios são e como usá-los em grande profundidade, conselhos gerais sobre a melhor prática é Nice - mas inútil;)
  3. Eu preciso sei porque eu estou construindo um aplicativo XNA para implantação no xbox. o xbox coletor de lixo é realmente lento - Isso significa que eu precisa para se manter alocações para um mínimo, de preferência inexistente (o que impede o coletor de nunca correr)
Foi útil?

Solução

Enquanto a alocação de blocos de sincronização ver internamente é preguiçoso (mas isso é um detalhe de implementação que IIRC Eu sei da Essential.NET 'Volume 1', ou é CLR via C # - e deve ser tratado como tal), o simples caso do item que necessitam de ser encaixotado como você está sugerindo não surge - veja Por bloqueio () não é permitido, mas Monitor.Enter () permitido?

Outras dicas

Se você estava pensando em usar:

Bloqueio (this)

Você deve saber que porque você está olhando em sua instância, os utilizadores do seu classe também poderia bloquear nele e parafuso-lo. Seja ou não esse é um questão depende do que você acha que seus usuários podem fazer. A mesma situação existe se você está fazendo:

Bloqueio (typeof (MyClass))

Se você não quiser fazer isso, você pode facilmente alocar um estático ou instância objecto (isto é objecto myLock = novo objecto ()), e, em seguida bloqueio em que.

Fonte

Na medida em que o bloqueio em um Tipo de referência vs tipo valor , este SO pergunta sobre Bloquear um recurso quando obtido ... tem a resposta:

Depende do tipo - se um tipo de referência, então sim, se um valor digite não. É também por isso que você deve nunca, nunca bloquear um tipo de valor desde o tipo de valor será embalado e qualquer tentativas subsequentes para bloquear em que valor será realmente adquirir um bloqueio em um objecto diferente.

Definição de declaração de bloqueio:

Declaração de bloqueio (C # Referência)

O bloqueio chave marcas uma declaração bloquear como uma secção crítica pela obtenção do lock-exclusão mútua para um dado objecto, a execução de um declaração, e em seguida, liberando o fechadura.

Este questão SO em palavras-chave de bloqueio em C # pode ser capaz de ajudar. Você também pode olhar para Por que lock () é não é permitido, mas Monitor.Enter () permitido?

A especificação para o compilador define o href="http://en.csharp-online.net/ECMA-334:%5F15.12%5FThe%5Flock%5Fstatement" rel="nofollow comportamento de bloqueio como assim :

O tipo de tempo de compilação do expressão de uma declaração de bloqueio deve ser um tipo de referência ou a> Tipo parâmetro (§25.1.1) conhecido por ser um tipo de referência. É um tempo de compilação de erro para o tipo de tempo de compilação do expressão para designar um tipo de valor.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top