Deve GC.SuppressFinalize ser chamados em objetos que não têm um finalizador?

StackOverflow https://stackoverflow.com/questions/621152

  •  05-07-2019
  •  | 
  •  

Pergunta

Por alguma razão FXCop parece pensar eu deveria estar chamando GC.SuppressFinalize em Dispose, independentemente de eu ter um finalizador ou não.

Estou faltando alguma coisa? Existe uma razão para chamar GC.SuppressFinalize em objetos que não têm finalizador definido?

Foi útil?

Solução

Há sempre um finalizador em IL - System.Object.Finalize () existe em cada classe, por isso, se você fizer uma classe personalizada, tem um finalizador você deseja suprimir. Dito isto, nem todos os objetos são colocados na fila de finalização, assim você só techncially deve precisar de finalização suprimir se você implementar seu próprio finalizador.

Se você está implementando IDisposable para envolver recursos não gerenciados, você deve incluir um finalizador, e você deve evitar que isso funcionando, já que, em teoria, você está fazendo a limpeza já quando Dispose é chamado.

Outras dicas

Não há nenhuma necessidade de GC.SuppressFinalize(this) chamada em Dispose, a menos que:

  • Você é a classe base que implementa métodos Descarte virtuais destinado a substituir (novamente, ele pode não ser de sua responsabilidade, mesmo aqui, mas você pode querer fazê-lo, nesse caso)
  • Você tem um finalizador si mesmo. Tecnicamente, todas as classes no .NET tem um finalizador, mas se o único finalizador presente é aquele em Object, em seguida, o objeto não é considerado como necessidade de finalização e não é colocado na lista de finalização em cima GC

Eu diria que, supondo que você não tem qualquer um dos casos acima, que você pode ignorar essa mensagem.

Todos os objetos têm um método finalizador, mesmo se você não tiver implementado um usando um c # destructor (que não é realmente garantido para ser chamado pelo GC). É apenas boas práticas para suprimir a chamada se você tiver implementado IDisposable porque isso significa que você decidiu realizar a finalização explicitamente.

devx artigo

Eu não vejo nenhuma necessidade de chamar SuppressFinalize () se não há nenhum finalizador definido. Se você quiser ficar na defensiva, então ele pode ser bom ter um finalizador, bem como Dispose (), para que você não precisa confiar em clientes para sempre chamar Dispose (). Então você não vai vazar recursos quando eles esquecem.

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