3

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

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,但认为它不会起作用(而且它没有)

4

6 回答 6

7

请注意,您实际上不能销毁对象;您必须遵守垃圾收集规则。在推送中,您可以检查IDisposable并调用 Dispose(),

您可以使用ref提供的示例,但我不确定是否有什么意义;使用“obj = null;”清除字段更简单。

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

var tmp = obj;
DestroyObject(ref tmp);

那么obj仍将是原始值。除非你有充分的理由,否则我不推荐这种ref方法。

于 2009-01-07T11:11:02.207 回答
5

你想要的是

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

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

于 2009-01-07T10:55:05.500 回答
3

C#中所有的参数都是传值的,所以如果要修改引用本身,就需要使用ref关键字来传递。

于 2009-01-07T10:58:34.713 回答
3

您在寻找IDisposable 模式吗?

于 2009-01-07T11:10:16.937 回答
2

[您的“CreatingClass”通常被称为工厂]

不知道为什么你会关心使一个对象无效;只有在删除所有对它的“根”引用后,它才会被垃圾收集。但是,如果您更改为:

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

并调用:

private void AFunctionToDeleteMyObject()    
{        
   CreatingClass.DestroyObject(ref obj);    
   Assert.IsNull(obj);  
}
于 2009-01-07T10:57:08.303 回答
0

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

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

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

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

于 2009-01-07T11:19:21.800 回答