【问题标题】:What does the tilde (~) character do here [duplicate]波浪号(〜)字符在这里做什么[重复]
【发布时间】:2010-11-22 19:59:51
【问题描述】:

可能重复:
What does the tilde (~) mean in 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);
}

波浪线在指示的行上做什么。

我认为它是按位 NOT 运算符,事实上我并不真正理解那里的整个块,(注释行和后面的括号 blovk),它不是方法,也不是参数或任何东西,它是什么,为什么前面有波浪线?

【问题讨论】:

  • 在 C++ 中,这意味着 ~ResourceWrapper 方法是析构函数(清理资源),它看起来像是根据那里的代码执行的。我在 C# 中从未见过。

标签: c# tilde


【解决方案1】:

那是destructor。它注意在垃圾收集时释放所有资源。

【讨论】:

  • @yshuditelu:感谢指正。
  • 其实yshuditelu是错的,~ClassName终结器(即Object.Finalize())——如果你用ildasm看看~ClassName编译成什么,你会看到它变成了override Finalize。使用特殊名称的原因是,与简单的覆盖相比,这里有一点魔力——C# 编译器总是插入对base.Finalize() 的调用。
  • @Pavel:虽然它在内部确实调用了 base.Finalize() 方法,但它被称为析构函数(C# 编程指南:msdn.microsoft.com/en-us/library/66x5fx1b.aspx)。
【解决方案2】:

这实现了类的终结器(Finalize 方法)。 通常你不应该实现终结器。

例如对拥有外部非托管资源的类执行此操作,但在这种情况下也要确保实现 IDisposable 模式。

【讨论】:

    【解决方案3】:

    就像在 C++ 中一样,~ClassName 是析构方法。当有问题的对象被垃圾收集器清理时,它会在 C# 中调用。与在 C++ 中调用析构函数有确定的时间不同,在 C# 中无法预测何时调用(或者即使调用)​​。

    您可能正在寻找的是IDisposable 模式,它为此提供了更好的方法。

    【讨论】:

      【解决方案4】:

      那是Destructor。它使您可以隐式控制释放资源。也就是说,它由Garbage Collector 调用。如果你想明确控制资源的释放,你可以实现IDisposable查看Implementing Finalize and Dispose to Clean Up Unmanaged ResourcesFramework Design Guidelines 也有更多信息。

      【讨论】:

        【解决方案5】:

        Ack,我刚刚找到答案,但看不到如何删除我的问题。它指定了类的析构函数

        【讨论】:

        • stackoverflow 上的问题不应该被删除(我不知道他们是否可以)......其他人可能有同样的问题,并找到你的问题(假设每个人在提问之前都使用搜索。 ..否则他们将作为这个问题的副本被关闭)
        【解决方案6】:

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

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

        也会与“不”的概念一起使用...... :)

        我可能错了……

        问候

        back2dos

        【讨论】:

        • 只是出于好奇:为什么会被否决?所有其他答案都表明我的猜测是正确的......
        • 我没有投赞成票或反对票,但猜测可能是因为您显然只是在猜测(即使答案是正确的,也很难相信答案),或者因为你把名字弄错了。它是析构函数,而不是解构函数。两者对我来说似乎都是小问题,但有些人可能会觉得它们值得 -1
        • 奇怪的哲学......事实上,从代码中可以明显看出,但我想强调一个事实,我不能 100% 确定,因为我真的不知道 C#......这意味着,我应该对来自其他平台/语言的人投反对票,将他们的一般知识应用于我的专业领域(通常与正确答案相去甚远,尽管甚至不承认他们不熟悉该平台(在 . NET 和 Java 开发人员)),甚至都不在乎指出他们为什么错了?无论如何,感谢您的努力... ;)
        • 您的猜测是对的……但如果您只是猜测某事,最好不要回答,以免被否决。回答你确定知道的科目。
        猜你喜欢
        • 2017-08-24
        • 1970-01-01
        • 2011-05-02
        • 2013-03-06
        • 1970-01-01
        • 2012-02-26
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多