这是一个场景:
在托管的c ++ dll中定义了一个类,并在C#项目中使用。
public ref class AClass {
// ......
XParameters m_oParams;
property XParameters^ Parameters {
XParameters^ get() { return m_oParams; }
}
}
XParameters是C#侧可见的另一个托管的c ++定义类。
C#代码如下所示:
var aClass = new AClass();
var oParams = aClass.Parameters;
aClass = null;
实际上,我想保证oParams
在为aClass
对象本身分配null后变为null。
有办法吗?
aClass = null
调用时到底发生了什么?
答案 0 :(得分:1)
“aClass = null
调用时会发生什么?”:aClass
变为null
,而aClass
之前引用的对象才有资格获得GC,如果它是最后一次引用对象(但这是隐式效果 - 现在没有“GC标记”行为)。
对象无法知道何时符合GC条件(因为它是隐式操作),或者对实例的引用是否更改为null /其他对象。所以没有办法“保证在为aClass指定null之后oParams变为null”。
答案 1 :(得分:1)
当调用aClass = null
时,它现在是一个空引用。它并没有改变oParams。在C#中,用户处理后无需将对象设置为null。
在这种情况下,最好将代码包装在使用状态。
using (var aClass = new AClass()){
var oParams = aClass.Parameters;
//do stuff
};//object is disposed
如果您将代码包装在try..finally
或using()
块中),则对象的终结器方法应为您调用Dispose()
。
可以在此处找到有关C#内存管理的良好资源: http://codebetter.com/karlseguin/2008/04/28/foundations-of-programming-pt-7-back-to-basics-memory/