波浪符号(~)在这里有什么作用?

7

可能是重复问题:
什么是C#中的波浪号(~)?

该问题可能是重复问题,可以参考上述链接了解在C#中波浪号(~)的含义。
class ResourceWrapper
{
    int handle = 0;
    public ResourceWrapper()
    {
        handle = GetWindowsResource();
    }
    ~ResourceWrapper()                     //this line here
    {
        FreeWindowsResource(handle);
        handle = 0;
    }
    [DllImport("dll.dll")]
    static extern int GetWindowsResource();
    [DllImport("dll.dll")]
    static extern void FreeWindowsResource(int handle);
}

波浪线在这一行上有什么作用?

我认为它是按位取反运算符,事实上我并不真正理解那整个块(注释行和括号块),它既不是方法,也不是参数或任何东西,它是什么以及为什么在它之前有一个波浪线?


1
在C++中,这意味着方法~ResourceWrapper是析构函数(清理资源),根据其中的代码,它似乎正在执行该操作。我从未在C#中看到过这种情况。 - Jared Updike
6个回答

10

那就是 析构函数。它会在垃圾回收时确保所有资源都被释放。


3
实际上,yshuditelu是错误的,“ClassName”是“Object.Finalize()”(即Object类的终结器) - 如果使用ildasm查看编译“ClassName”的结果,您会看到它变成了“override Finalize”。特殊名称的原因是与简单的重写相比有一些魔法 - C#编译器总是插入对base.Finalize()的调用。 - Pavel Minaev
1
@Pavel:虽然它在内部调用了base.Finalize()方法,但它被称为析构函数(C# 编程指南:http://msdn.microsoft.com/zh-cn/library/66x5fx1b.aspx)。 - Josip Medved

3

这实现了类的终结器(Finalize方法)。

通常情况下,您不应该实现终结器。

例如,对于持有外部非托管资源的类,请执行此操作,但在这种情况下一定要实现IDisposable模式。


3

与C++类似,~ClassName是析构函数方法。在C#中,当垃圾收集器清理相关对象时,将调用该方法。与C++不同的是,在C#中无法预测何时调用析构函数(甚至是否会调用)。

您可能正在寻找的是IDisposable模式,它提供了更好的解决方案。


1

0
哎呀,我刚找到答案,但不知道怎样删除问题。它指定了类的析构函数。

3
在Stack Overflow上的问题不应该被删除(我不知道它们是否可以被删除)......其他人可能有相同的问题,并且会找到你的问题(假设每个人在提问之前都使用搜索功能...否则,他们的问题将被关闭为复制此问题)。 - back2dos

0

我对C#一无所知,但从代码的作用来看,这似乎是一个解构器,它说:

  1. 释放由handle引用的资源
  2. handle设置为0以确保

这也与“不”的概念有点相似... :)

虽然我可能错了...

问候

back2dos


仅出于好奇:为什么这个被投票否决了?所有其他答案都表明我的猜测是正确的... - back2dos
我没有投赞成或反对票,但猜测可能是因为你显然只是在猜测(即使答案是正确的,也很难信任),或者是因为你搞错了名称。它是析构函数,而不是解构函数。这两个问题对我来说似乎都不太重要,但有些人可能会认为这些问题值得扣1分。 - jalf
1
奇怪的哲学...实际上从代码中可以看出来,但我想强调的是我不能百分之百确定,因为我不太了解C#...这是否意味着我应该对其他平台/语言的人应用他们的通用知识到我的专业领域(经常非常远离正确答案,尽管他们甚至不承认自己不熟悉该平台(在.NET和Java开发人员中非常流行))进行投反对票,而不关心指出他们错在哪里?无论如何,感谢您的努力...;) - back2dos
你对你的猜测是正确的...但如果你只是在猜测某件事情,最好不要回答,这样可以避免被踩。只回答你确信的主题。 - Jone Polvora

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接