假設在某個型別的建構式里面拋出了例外,那么這個物件的解構式是否會執行
如下面代碼
private void F1()
{
try
{
_ = new Foo();
}
catch
{
// 忽略
}
}
class Foo
{
public Foo()
{
throw new Exception("lindexi is doubi");
}
~Foo()
{
}
}
請問以上代碼的 ~Foo 是否可以在垃圾回收執行,或者說在建構式里面拋出例外,是否這個物件可以被垃圾回收
試試以下代碼,然后在 ~Foo 添加斷點
static void Main(string[] args)
{
AppDomain.CurrentDomain.UnhandledException += CurrentDomain_UnhandledException;
var program = new Program();
program.F1();
GC.Collect();
GC.WaitForFullGCComplete();
GC.Collect();
Task.Delay(1000).Wait();
Console.WriteLine("Hello World!");
}
其實可以看到,可以進入 ~Foo 的代碼,原因是在 .NET 運行時,是先創建出物件,然后再呼叫物件的建構式,而在創建出物件時,此物件就需要被加入垃圾回收,加入垃圾回收,自然就會呼叫到解構式
那為什么即使在建構式里面拋出例外,沒有構造成功,也需要在垃圾回收呼叫解構式,是因為建構式也不一定是一句話都沒有跑的,例如在建構式里面已分配了一些非托管的記憶體,然后再拋出例外,自然就期望在解構式可以釋放分配的記憶體,也就是期望呼叫解構式
本文代碼還請到 github 或 gitee 上閱讀代碼
可以通過如下方式獲取本文的源代碼,先創建一個空檔案夾,接著使用命令列 cd 命令進入此空檔案夾,在命令列里面輸入以下代碼,即可獲取到本文的代碼
git init
git remote add origin https://gitee.com/lindexi/lindexi_gd.git
git pull origin 3f16a1492f1d655ad5356e65d476c3c91b129844
以上使用的是 gitee 的源,如果 gitee 不能訪問,請替換為 github 的源
git remote remove origin
git remote add origin https://github.com/lindexi/lindexi_gd.git
獲取代碼之后,進入 HojeneceabuHallwhallhebo 檔案夾
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/288012.html
標籤:C#
