〜运算符在此代码中有什么用途?

时间:2010-10-04 07:45:08

标签: c# swig

我已经深入挖掘了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将应用于班级的构造函数,所以我的问题是

  1. 为什么这个例子中~运算符的目的是什么?
  2. 它有什么影响?
  3. 使用这种操作员和技术的正确情况是什么?
  4. 编辑:

    为了清楚起见,~就是这种情况称为Destructor。谢谢@Arcturus。

5 个答案:

答案 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)

它表示destructor

  

析构函数用于销毁类的实例。

它们在C#中使用不多,因为托管资源由垃圾收集器处理。

答案 4 :(得分:1)

这是一个析构函数 - 至少在C ++中,看起来像C#决定让它不像java那样没有它