Question

J'ai un objet généré dans une classe

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

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

J'appelle cette fonction à partir d'une classe client, puis il faut parfois l'annuler via mon application par la classe qui crée.

Puis-je faire quelque chose comme ce qui suit

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
    }
}

J'avais essayé objectToDestroy = null, mais je ne pensais pas que cela fonctionnerait (et cela n'a pas fonctionné)

Était-ce utile?

La solution

Notez que vous ne pouvez pas réellement détruire un objet. vous êtes soumis aux règles de la récupération de place. En un clic, vous pouvez vérifier IDisposable et appeler Dispose (),

.

Vous pouvez utiliser les exemples ref fournis, mais je ne suis pas sûr qu'il y ait beaucoup d'intérêt. il est plus simple d'effacer le champ avec "obj = null;".

L’utilisation de ref peut prêter à confusion, car cela fonctionne pour la variable - c’est-à-dire si vous le faites:

var tmp = obj;
DestroyObject(ref tmp);

alors obj sera toujours la valeur d'origine. À moins que vous n'ayez une bonne raison, je ne recommande pas l'approche ref .

Autres conseils

Ce que vous voulez, c'est

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

Ceci définira votre référence locale sur null

Tous les paramètres en C # sont passés par valeur. Par conséquent, si vous souhaitez modifier la référence elle-même, vous devez la transmettre à l'aide du mot clé ref .

Recherchez-vous le modèle IDisposable ?

[Votre 'CreatingClass' est généralement appelée une usine]

Vous ne savez pas pourquoi vous voudriez annuler un objet; il ne sera ramassé que lorsque toutes les références 'racine' à ce fichier auront été supprimées. Mais si vous changez pour:

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

et appelez en tant que:

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

Une petite précision sur les réponses fournies ...

Les paramètres en C # sont passés par leur type, valeur pour les types valeur, référence pour les types référence. Cependant, vous passez une interface qui pourrait concerner une classe (type de référence) ou une struct (type de valeur), vous devez donc le déclarer explicitement en tant que variable ref.

Cependant, ce que vous devriez vraiment suivre (comme mentionné précédemment) est le motif IDisposable, qui a été conçu pour cette fonctionnalité.

EDIT: les paramètres sont passés par valeur, mais pour les types de référence, la référence est la valeur. Par conséquent, si vous détruisez la référence dans la fonction, le type de référence d'origine n'est pas affecté. Si vous modifiez la variable de référence, c’est-à-dire que vous modifiez des données dans un jeu de données, le type de référence initial est mis à jour en dehors de la fonction.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top