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)

War es hilfreich?

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.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top