我已经深入挖掘了SWIG为Quantlib生成的C#代码,并遇到了以下代码,这给了我一个谦卑的时刻。
每个生成的类都实现IDisposable
,并且每个生成的类都遵循以下指出的约定。
public class MultiPath : IDisposable { // MultiPath is interchangable
private HandleRef swigCPtr;
protected bool swigCMemOwn;
internal MultiPath(IntPtr cPtr, bool cMemoryOwn) {
swigCMemOwn = cMemoryOwn;
swigCPtr = new HandleRef(this, cPtr);
}
internal static HandleRef getCPtr(MultiPath obj) {
return (obj == null) ? new HandleRef(null, IntPtr.Zero) : obj.swigCPtr;
}
~MultiPath() { // <----
Dispose();
}
public virtual void Dispose() {
lock(this) {
if (swigCPtr.Handle != IntPtr.Zero) {
if (swigCMemOwn) {
swigCMemOwn = false;
NQuantLibcPINVOKE.delete_MultiPath(swigCPtr);
}
swigCPtr = new HandleRef(null, IntPtr.Zero);
}
GC.SuppressFinalize(this);
}
}
// snip
}
如果我正确阅读,bitwise complement operator将应用于班级的构造函数,所以我的问题是
~
运算符的目的是什么? 编辑:
为了清楚起见,~
就是这种情况称为Destructor。谢谢@Arcturus。
答案 0 :(得分:8)
它是destructor!
简单来说,析构函数是一个 实现操作的成员 需要破坏一个实例 类。析构函数启用了 运行时系统,以恢复堆 空间,终止文件I / O. 与删除的类相关联 实例,或执行两者 操作
答案 1 :(得分:2)
它是“Finalize”的简写,如果你忘记自己调用Dispose,那么可能被垃圾收集器调用的非公开方法。
我强调'可能'这个词。除非你做了像调用GC.WaitForPendingFinalizers之类的蠢事,否则.NET不会向你保证它会实际清理你的非托管资源,比如指针和数据库连接。如果您的代码搞砸了,这只是一个额外的保护层。
注意第GC.SuppressFinalize(this);
行。这告诉垃圾收集器你记得调用Dispose,它不需要浪费时间运行Finalize方法。
答案 2 :(得分:1)
它标志着该类的析构函数。关注Destructors (C# Programming Guide)以获取更多信息。
答案 3 :(得分:1)
答案 4 :(得分:1)
这是一个析构函数 - 至少在C ++中,看起来像C#决定让它不像java那样没有它