如果我定义了~Example
部分,那么垃圾收集是否存在差异?
class Example
{
public void Display()
{
Console.WriteLine("hi");
}
~Example()//**does giving this part or not has any effects in garbage collection**
{
}
}
和
class Example
{
public void Display()
{
Console.WriteLine("hi");
}
}
答案 0 :(得分:5)
C#是一种垃圾收集语言。这意味着.NET框架(其中使用C#编写的代码)具有内存管理机制。我们不喜欢在C ++中关心被创建对象的破坏,以便我们不会有很高的内存占用或内存泄漏。这是垃圾收集器的工作。
正如在MSDN
中更正式地陈述的那样通常,C#不需要所需的内存管理 当您使用不以运行时为目标的语言进行开发时 垃圾收集。这是因为.NET Framework垃圾 collector隐式管理内存的分配和释放 你的对象。但是,当您的应用程序封装非托管时 您应该使用Windows,文件和网络连接等资源 使用析构函数来释放这些资源。当对象符合条件时 对于销毁,垃圾收集器运行的Finalize方法 对象
然而,析构函数的概念也存在于C#中,并且在其他语言中也用于销毁类的实例。此外,无法调用析构函数 。它会自动调用。
例如,如果我们声明以下类:
class Customer
{
~Customer()
{
// Here we place our clean up statements.
}
}
析构函数将隐式调用对象基类的Finalize
方法。正如在上面的链接中解释的那样,这个代码将被C#编译器翻译成下面的代码:
protected override void Finalize()
{
try
{
// Here goes our clean up statements.
}
finally
{
base.Finalize();
}
}
这意味着Finalize方法被称为递归 所有 继承链中的实例,从最大派生到 至少衍生的。
无论如何,你应该记住以下几点:
程序员无法控制何时调用析构函数 因为这是由垃圾收集器决定的。垃圾 收集器检查不再被使用的对象 应用。如果它认为某个对象有资格进行销毁,那么 调用析构函数(如果有的话)并回收用于存储的内存 物体。程序退出时也会调用析构函数。
答案 1 :(得分:0)
如果析构函数实际上有一些正在执行的代码,那么当然这将是一个区别,但是你不能保证它被调用的时间等等。 另外,你问一个关于asp.net的问题,但你从控制台应用程序发布了代码吗?
答案 2 :(得分:0)