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

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

有帮助吗?

解决方案

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

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

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

var tmp = obj;
DestroyObject(ref tmp);

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

其他提示

你想要的是

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

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

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

您是否正在寻找 IDisposable模式

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

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

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

并致电:

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

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

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

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

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top