草庐IT

c# - 为什么 WeakReference 在析构函数中没用?

考虑以下代码:classProgram{staticvoidMain(string[]args){Aa=newA();CreateB(a);GC.Collect();GC.WaitForPendingFinalizers();Console.WriteLine("Andhere's:"+a);GC.KeepAlive(a);}privatestaticvoidCreateB(Aa){Bb=newB(a);}}classA{}classB{privateWeakReferencea;publicB(Aa){this.a=newWeakReference(a);}~B(){Console.

c# - native 和托管析构函数

我有一个native对象(C++),它有一个指向托管对象(C#)的gcroot指针。classSomeNativeClass{gcrootmanagedClass;};问题当我在我之前分配的native代码delete(someNativeClass)中删除此类的native实例时,managedClass实例是否会被垃圾收集或我是否应该显式删除它(在native析构函数)也是吗? 最佳答案 Ifonlydeletethenativeobjectandthemanagedisnotreferencedanywhereelse,wou

c# - 为什么我的析构函数从不运行?

我有一个带有析构函数方法的空白WinformpublicpartialclassForm1:Form{publicForm1(){System.Diagnostics.Trace.WriteLine("Form1.Initialize"+this.GetHashCode().ToString());InitializeComponent();}~Form1(){System.Diagnostics.Trace.WriteLine("Form1.Dispose"+this.GetHashCode().ToString());}}当表单被销毁时,我希望它写入输出窗口:(Form1opene

c# - C# 中的继承和析构函数

根据this,它声明析构函数不能被继承或重载。在我的例子中,对于所有子类,析构函数将是相同的。这几乎是在告诉我必须在每个子类中定义相同的析构函数吗?我无法在基类中声明析构函数并处理销毁?假设我有这样的东西:classA{~A(){SomethingA();}}classB:A{}Bb=newB();当B被销毁时,它的析构函数不会被调用吗? 最佳答案 Accordingtothis,itstatesthatDestructorscannotbeinheritedoroverloaded.正确。析构函数不是可继承的成员,也不是虚拟的,因

c# - 为什么静态类不能有析构函数?

分为两部分:如果静态类可以有静态构造函数,为什么不能有静态析构函数?最好的解决方法是什么?我有一个静态类来管理作为COM对象的连接池,如果程序中的其他地方出现问题,我需要确保关闭/释放它们的连接。 最佳答案 您应该使用具有单例模式的普通类而不是静态类(也就是说,您保留该类的一个实例,可能由该类本身的一个静态属性引用)。然后你可以有一个析构函数,或者更好的是,析构函数和Dispose的组合方法。例如,如果您现在有:staticclassMyClass{publicstaticvoidMyMethod(){...}}//Usingthe

c# - 析构函数永远不会被调用

这个问题在这里已经有了答案:Whydoesmydestructorneverrun?(6个答案)关闭9年前。我有一个类Class,它在其构造函数中创建了一个Thread。此线程运行一个while(true)循环,该循环正在从NetStream中读取非关键数据。该线程将被析构函数中止:~Class(){_thread.Abort();_thread=null;}当程序想要结束使用Class的实例——ClassInstance时,它调用:ClassInstance=null;GC.Collect;我认为这意味着~Class()将在此时自动调用-但事实并非如此。即使在Application.

c# - 关于C#中Dispose()和析构函数的两个问题

我有一个关于如何使用Dispose()和析构函数的问题。阅读一些文章和MSDNdocumentation,这似乎是实现Dispose()和析构函数的推荐方式。但是我有两个关于这个实现的问题,你可以在下面阅读:classTesting:IDisposable{bool_disposed=false;protectedvirtualvoidDispose(booldisposing){if(!_disposed)//onlydisposeonce!{if(disposing){//Notindestructor,OKtoreferenceotherobjects}//performclea

c# - 析构函数 - 如果应用程序崩溃,它会被调用吗

如果应用程序崩溃,是否会调用析构函数?如果这是一个未处理的异常,我猜是这样,但是更严重的错误,或者诸如用户终止应用程序进程之类的错误呢?还有一些潜在的愚蠢问题:当应用程序退出并且所有终结器都已执行时,应用程序中的所有对象会发生什么情况-对象是否被垃圾收集,或者它们是否以某种方式全部“卸载”到进程或应用程序域?垃圾收集器是每个应用程序的一部分(在同一进程中运行)还是独立的? 最佳答案 我鼓励您亲自尝试一下。例如:usingSystem;classProgram{staticvoidMain(string[]args){vart=new

PHP 析构函数和与 C++ 析构函数的关系?

我很难理解在PHP类析构函数中应该做什么我来自C++。在C++中,如果我有这个:classA{intn;~A(){}}classA2{int*n;~A2(){deleten;}}语言知道如果A的实例超出范围,它的成员n应该被释放,因为n只属于那个例子。但是如果A2的实例超出范围,它不知道是否应该释放n指向的内存(也许还有其他指针指向那个相同的内存)但是,如果我们确定要在A2实例超出范围时释放该内存,我们需要手动“删除”它,因为这是我们的意图。PHP呢?我是新手,见过几种解决方案:classA3{private$n;publicfunction__destruct(){//Choice1

php - PHP 类析构函数是否总是在 Apache HTTP 请求线程上下文中调用?

我有一个PHP应用程序(PHP5.3),其中的日志记录是在类析构函数中完成的。/***@returnvoid*/publicfunction__destruct(){$string=...$file=newSplFileObject('filename','a');$file->fwrite($string."\n");}只有一台服务器在做日志记录。基本上,执行日志记录的代码会保存当前时间戳(请求结束)以及其他信息,例如持续时间......奇怪的是,当我查看日志时,时间戳并不总是按时间顺序出现。我有将近2分钟的差异。例如(我的日志):2014-05-1014:30:00log12014