Pergunta

Eu tenho um objeto que é gerado em uma classe

public class CreatingClass
{
    public T CreateObject<T>(Dictionary<string, object> parameters) where T : IMyInterface, new()
    {
        ....
    }

    public void DestroyObject(IMyInterface objectToDestroy)
    {
        ....
    }
}

Eu chamo esta função a partir de uma classe do cliente, em seguida, às vezes precisa anulá-lo através do meu aplicativo pela classe criando.

Posso fazer algo como o seguinte

public class ClientClass
{
    MyObject obj;
    CreatingClass creatingClass = new CreatingClass();

    private void AFunctionToCreateMyClass()
    {
        obj = creatingClass.CreateObject<MyClass>(parameters);
    }

    private void AFunctionToDeleteMyObject()
    {
        CreatingClass.DestroyObject(obj);
        Assert.IsNull(obj);//Doesn't fail
    }
}

Eu tinha tentado objectToDestroy = null, mas não acho que ele iria trabalhar (e não fez)

Foi útil?

Solução

Note que você não pode realmente destruir um objeto; você está sujeito às regras de coleta de lixo. Em um impulso, você pode verificar para IDisposable e chamar Dispose (),

Você pode usar as amostras ref fornecido, mas não tenho certeza de que há muito ponto; é mais simples apenas para limpar o campo com "obj = null;".

O uso ref poderia ficar confusa, uma vez que as obras no variável - ou seja, se você fizer isso:

var tmp = obj;
DestroyObject(ref tmp);

então obj ainda será o valor original. A menos que você tenha uma boa razão, eu não recomendo a abordagem ref.

Outras dicas

O que você quer é

public void DestroyClass(ref IMyInterface objectToDestroy)
{
    ....
    objectToDestroy = null;
}

Esta é irá definir o seu local de referência para NULL

Todos os parâmetros em C # são passados ??por valor, por isso, se você deseja modificar a própria referência, é preciso passá-lo usando a palavra-chave ref.

Você está procurando o IDisposable padrão ?

[Your 'CreatingClass' é usualmente denominado uma fábrica]

Não sei por que você estaria preocupado com anulando um objeto; ele vai ser lixo coletado somente após todas as referências 'root' a ele foram removidas. Mas se você mudar para:

 public void DestroyClass(ref IMyInterface objectToDestroy)   
 {       
     ....    
     objectToDestroy = null;
 }

e chamada como:

private void AFunctionToDeleteMyObject()    
{        
   CreatingClass.DestroyObject(ref obj);    
   Assert.IsNull(obj);  
}

Um pouco esclarecimento sobre as respostas fornecidas ...

Parâmetros em C # são passados ??por seu tipo, valor para tipos de valor, de referência para tipos de referência. Você no entanto, estão passando uma interface que poderia se relacionar a uma classe (tipo de referência) ou struct (tipo de valor), portanto, você precisa declará-la explicitamente como uma variável ref.

No entanto, o que você deve realmente seguir (como mencionado anteriormente) é o padrão IDisposable, que foi projetado para essa funcionalidade.

EDIT: Os parâmetros são passados ??por valor, mas para tipos de referência a referência é o valor. Por isso é que você destruir o refence na função, o tipo de referência original não é afetado. Se você fizer uma alteração para a variável de referência, ou seja, modificar dados em um conjunto de dados, o tipo de referência original é atualizado fora da função.

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