首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >~运算符在这个代码中有什么用途?

~运算符在这个代码中有什么用途?
EN

Stack Overflow用户
提问于 2010-10-04 07:45:07
回答 5查看 482关注 0票数 2

我已经深入研究了SWIG为Quantlib生成的C#代码,并看到了下面的代码,这些代码给了我一个谦卑的时刻。

每个生成的类都实现IDisposable,每个生成的类都有下面指出的约定。

代码语言:javascript
复制
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
}

如果我正确地阅读了这篇文章,位补算子就会被应用到类的构造函数中,所以我的问题是

  1. 为什么在这个例子中~操作符的用途是?
  2. 它有什么影响?
  3. 使用这种操作人员和技术的正确情况是什么?

编辑:

为了清楚起见,~是这个例子称为破坏者。谢谢@Arcturus

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2010-10-04 07:46:46

这是破坏者

简单地说,析构函数是实现解构类实例所需的操作的成员。析构函数使运行时系统能够恢复堆空间,终止与已删除的类实例关联的文件I/O,或者执行这两个操作。

票数 8
EN

Stack Overflow用户

发布于 2010-10-04 08:15:46

"Finalize“是一种非公共方法,如果您忘记自己调用Dispose,垃圾收集器可能会调用它。

我强调“可能”这个词。除非您做一些愚蠢的事情,比如调用GC.WaitForPendingFinalizers,否则.NET不会保证它实际上会清理您的非托管资源,比如指针和数据库连接。这只是一层额外的保护,以防你的代码被搞砸了。

注意行GC.SuppressFinalize(this);。这告诉垃圾收集器,您记得要调用Dispose,它不需要浪费时间运行Finalize方法。

票数 2
EN

Stack Overflow用户

发布于 2010-10-04 07:47:18

它标记了类的析构函数。请跟随析构函数(C#编程指南)获取更多信息。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3853440

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档