C#我可以从另一个类中取消对象

时间:2009-01-07 10:50:33

标签: c# .net null

我有一个在一个类中生成的对象

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

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

我从客户端类调用此函数,然后有时需要通过创建类通过我的应用程序使其无效。

我可以执行以下

之类的操作
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
    }
}

我曾尝试过objectToDestroy = null,但不认为它会起作用(而且它没有)

6 个答案:

答案 0 :(得分:7)

请注意,您实际上无法销毁对象;你受垃圾收集规则的约束。推送时,您可以检查IDisposable并调用Dispose(),

您可以使用提供的ref个样本,但我不确定有多少意义;用“obj = null;”清除字段更简单。

ref用法可能会让人感到困惑,因为它适用于变量 - 即如果你这样做:

var tmp = obj;
DestroyObject(ref tmp);

然后obj仍然是原始值。除非你有充分的理由,否则我不推荐使用ref方法。

答案 1 :(得分:5)

你想要的是

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

这会将您的本地引用设置为null

答案 2 :(得分:3)

C#中的所有参数都是按值传递的,因此如果您想修改引用本身,则需要使用ref关键字传递它。

答案 3 :(得分:3)

您在寻找IDisposable pattern吗?

答案 4 :(得分:2)

[你的'CreatingClass'通常被称为工厂]

不确定为什么要关注对象的无效;只有在删除了对它的所有“root”引用之后,它才会被垃圾收集。但如果你改为:

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

并致电:

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

答案 5 :(得分:0)

对所提供的答案进行一点澄清......

C#中的参数按其类型,值类型的值,引用类型的引用传递。但是,您传递的接口可能与类(引用类型)或结构(值类型)相关,因此您需要将其显式声明为ref变量。

但是,您应该遵循的(如前所述)是IDisposable模式,它是为此功能而设计的。

编辑:参数按值传递,但对于引用类型,引用是值。因此,你破坏了函数中的refence,原始引用类型不受影响。如果对参考变量进行更改,即修改数据集中的数据,则会在函数外部更新原始引用类型。