C # Posso anular um objeto de outra classe
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)
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.