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!

Foi útil?

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.

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