C # Posso annullare un oggetto di un'altra classe
Domanda
Ho un oggetto che viene generato in una classe
public class CreatingClass
{
public T CreateObject<T>(Dictionary<string, object> parameters) where T : IMyInterface, new()
{
....
}
public void DestroyObject(IMyInterface objectToDestroy)
{
....
}
}
Chiamo questa funzione da una classe client, quindi a volte devo annullarla attraverso la mia applicazione dalla classe che crea.
Posso fare qualcosa del tipo
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
}
}
Avevo provato objectToDestroy = null, ma non pensavo che avrebbe funzionato (e non ha funzionato)
Soluzione
Nota che non puoi effettivamente distruggere un oggetto; sei soggetto alle regole della raccolta dei rifiuti. Con un semplice clic, è possibile verificare IDisposable
e chiamare Dispose (),
Puoi usare gli esempi ref
forniti, ma non sono sicuro che ci sia molto da dire; è più semplice cancellare il campo con " obj = null; " ;.
L'utilizzo di ref
potrebbe creare confusione, dal momento che funziona sulla variabile - vale a dire se si fa:
var tmp = obj;
DestroyObject(ref tmp);
quindi obj
sarà comunque il valore originale. A meno che tu non abbia una buona ragione, non raccomando l'approccio ref
.
Altri suggerimenti
Quello che vuoi è
public void DestroyClass(ref IMyInterface objectToDestroy)
{
....
objectToDestroy = null;
}
Questo imposterà il riferimento locale su null
Tutti i parametri in C # vengono passati per valore, quindi se si desidera modificare il riferimento stesso, è necessario passarlo utilizzando la parola chiave ref
.
Stai cercando il Motivo identificabile ?
[Il tuo 'CreatedClass' è generalmente definito una fabbrica]
Non so perché ti preoccuperesti di annullare un oggetto; sarà spazzatura raccolta solo dopo che tutti i riferimenti "root" sono stati rimossi. Ma se cambi in:
public void DestroyClass(ref IMyInterface objectToDestroy)
{
....
objectToDestroy = null;
}
e chiama come:
private void AFunctionToDeleteMyObject()
{
CreatingClass.DestroyObject(ref obj);
Assert.IsNull(obj);
}
Un piccolo chiarimento sulle risposte fornite ...
I parametri in C # vengono passati per tipo, valore per tipi di valore, riferimento per tipi di riferimento. Tuttavia, stai passando un'interfaccia che potrebbe essere correlata a una classe (tipo di riferimento) o struct (tipo di valore), pertanto devi dichiararla esplicitamente come variabile ref.
Tuttavia, ciò che dovresti davvero seguire (come menzionato in precedenza) è il modello IDisposable, che è stato progettato per questa funzionalità.
EDIT: i parametri vengono passati per valore, ma per i tipi di riferimento il riferimento è il valore. Pertanto, si distrugge il riferimento nella funzione, il tipo di riferimento originale non è interessato. Se apporti una modifica alla variabile di riferimento, ovvero modificando i dati in un set di dati, il tipo di riferimento originale viene aggiornato al di fuori della funzione.