我有一个在一个类中生成的对象
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,但不认为它会起作用(而且它没有)
答案 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,原始引用类型不受影响。如果对参考变量进行更改,即修改数据集中的数据,则会在函数外部更新原始引用类型。