C # usando o uso do bloco com objetos estáticos
Pergunta
Eu estou adicionando algum código em um bloco using
em um programa C #. Eu sou uma espécie de encher meu aplicativo, que anteriormente era um autônomo em um corpo existente de código, então eu preciso fazer um pouco de andar para obtê-lo para se ajustar corretamente. O que ele está terminando acima de olhar como é o seguinte:
public class WrapperForMyOldApp
{
public static ItemThatINeed item1;
public static ItemThatINeed item2;
public WrapperForMyOldApp ()
{
item1 = new ItemThatINeed();
item2 = new ItemThatINeed();
}
public static go()
{
// some stuff that i need to do with items 1 and 2
}
}
public class MainProgram
{
.
.
.
public void MethodThatNeedsToMakeUseOfMyApp ()
{
....
using (WrapperForMyOldApp oldAPp = new WrapperForMyOldApp())
{
WrapperForMyOldApp.go();
}
}
}
Tudo bem, então a questão aqui é: fiz eu agora aleijado os efeitos do bloco usando e / ou criado quaisquer efeitos colaterais peculiares que podem afetar adversamente a MainProgram classe? Eu acredito que o objeto Wrapper e seu conteúdo será eliminado e execução continuará como esperado, mas há algo que eu preciso estar ciente de que eu estou com vista?
Obrigado!
Solução
Para que isso funcione, você precisa ter WrapperForMyOldApp implementar IDisposable.
A chamada Dispose () em WrapperForMyOldApp, então, fazer a sua limpeza.
No entanto, objetos estáticos são normalmente utilizados para objetos que têm uma vida além do único objeto. Em geral, para este tipo de uso, você faria a casos ItemThatINeed non-static, gerá-los em seu construtor WrapperForMyOldApp, em seguida, limpá-los em WrapperForMyOldApp.Dispose ().
Com objetos estáticos, você está criando potencialmente um pesadelo - você está construindo o objeto e, em seguida, dizendo que pretende efectuar a limpeza (no final do bloco usando), para que Dispose () método seria de limpeza os objetos estáticos. No entanto, se eles se acostumar de novo, o que deve acontecer? Qual é o comportamento correto se você criar duas instâncias WrapperForMyOldApp com 2 fios? Gostaria de considerar essas questões se você quiser limpeza determinista.
Outras dicas
A sua classe wrapper implementar IDisposable e você apenas não está mostrando isso? Se não estiver disponível, então você não precisa a instrução usando a todos.
Bem, se implementos WrapperForMyOldApp
IDisposable
, e sua implementação Dispose()
pode ser certo para se livrar de quaisquer recursos, então ele deve funcionar ... mas pode haver outros efeitos colaterais. O código poderia alterar o estado global (estática), tais como cultura, etc. Ele poderia gerar threads. Todos os tipos de coisas.
Não é uma abordagem ruim, mas você precisa saber o que o código que você está encapsulando faz para saber se Dispose()
vai fazer nada de útil.