C # Kann ich ein Objekt aus einer anderen Klasse zunichte machen
Frage
Ich habe ein Objekt, das in einer Klasse erzeugt wird,
public class CreatingClass
{
public T CreateObject<T>(Dictionary<string, object> parameters) where T : IMyInterface, new()
{
....
}
public void DestroyObject(IMyInterface objectToDestroy)
{
....
}
}
Ich nenne diese Funktion aus einer Client-Klasse, dann manchmal müssen sie durch meine Anwendung durch die Erstellung Klasse zunichte zu machen.
Kann ich etwas tun, wie das folgende
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
}
}
Ich hatte versucht, objectToDestroy = null, aber nicht glaubte, es würde funktionieren (und es nicht)
Lösung
Beachten Sie, dass Sie nicht tatsächlich ein Objekt zerstören; Sie sind an die Regeln der Garbage Collection Thema. Bei einem Push, könnten Sie für IDisposable
überprüfen und rufen Sie Dispose ()
Sie können das ref
Proben zur Verfügung gestellt, aber ich bin nicht sicher, dass es viel Sinn; es einfacher ist, nur das Feld löschen mit „obj = null;“.
Die ref
Nutzung könnte verwirrend, da das funktioniert auf die Variable - das heißt, wenn Sie tun:
var tmp = obj;
DestroyObject(ref tmp);
dann wird obj
noch der ursprüngliche Wert sein. Es sei denn, Sie haben einen guten Grund, ich den ref
Ansatz nicht empfehlen.
Andere Tipps
Was Sie wollen, ist
public void DestroyClass(ref IMyInterface objectToDestroy)
{
....
objectToDestroy = null;
}
Dies ist Ihre lokale Referenz auf null gesetzt
Alle Parameter in C # werden von Wert übergeben, so dass, wenn Sie die Referenz selbst ändern möchten, müssen Sie es passieren das ref
Schlüsselwort.
Suchen Sie die IDisposable Muster ?
[Ihr 'CreatingClass' ist in der Regel eine Fabrik bezeichnet]
Nicht sicher, warum Sie mit zunichte macht ein Objekt betroffen sein würden; es wird Müll erst, nachdem alle ‚root‘ Referenzen gesammelt, um es entfernt worden ist. Aber wenn Sie zu ändern:
public void DestroyClass(ref IMyInterface objectToDestroy)
{
....
objectToDestroy = null;
}
und rufen wie:
private void AFunctionToDeleteMyObject()
{
CreatingClass.DestroyObject(ref obj);
Assert.IsNull(obj);
}
Eine wenig Aufklärung über die Antworten geliefert ...
Parameter in C # werden durch ihre Art, den Wert für Werttypen, Referenz für Referenztypen übergeben. Sie sind jedoch vorbei eine Schnittstelle, die zu einer Klasse (Referenztyp) oder Struktur (Werttyp) in Zusammenhang stehen könnten, daher müssen Sie explizit als ref Variable deklarieren.
Doch was sollten Sie wirklich folgen (wie bereits erwähnt) ist das IDisposable Muster, die für diese Funktionalität entwickelt wurde.
EDIT: Parameter Wert übergeben werden, aber für Referenztypen der Referenz ist der Wert. Daher ist es, Sie die refence in der Funktion zu zerstören, ist der ursprüngliche Referenztyp nicht betroffen. Wenn Sie eine Änderung der Führungsgröße machen, das heißt Daten in einem Datensatz, der ursprüngliche Referenztyp modifiziert wird außerhalb der Funktion aktualisiert.