2021-06-17

dotnet C# 如果在构造函数抛出异常 析构函数是否会执行

假设在某个类型的构造函数里面抛出了异常,那么这个对象的析构函数是否会执行

假设在某个类型的构造函数里面抛出了异常,那么这个对象的析构函数是否会执行

如下面代码

  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 initgit remote add origin https://gitee.com/lindexi/lindexi_gd.gitgit pull origin 3f16a1492f1d655ad5356e65d476c3c91b129844

以上使用的是 gitee 的源,如果 gitee 不能访问,请替换为 github 的源

git remote remove origingit remote add origin https://github.com/lindexi/lindexi_gd.git

获取代码之后,进入 HojeneceabuHallwhallhebo 文件夹









原文转载:http://www.shaoqun.com/a/809659.html

跨境电商:https://www.ikjzd.com/

汇通达:https://www.ikjzd.com/w/1758

weebly:https://www.ikjzd.com/w/2486

墩煌网:https://www.ikjzd.com/w/189

四海商舟:https://www.ikjzd.com/w/1516


假设在某个类型的构造函数里面抛出了异常,那么这个对象的析构函数是否会执行假设在某个类型的构造函数里面抛出了异常,那么这个对象的析构函数是否会执行如下面代码privatevoidF1(){try{_=newFoo();}catch{//忽略}}classFoo{publicFoo(){thrownewException("lindexiisdoubi");}~Foo(){}}请问
美菜网:https://www.ikjzd.com/w/1874
小说:我公公和我妈是怎么产生感情的:http://www.30bags.com/a/363257.html
女朋友过生日送什么礼物好 浪漫最重要:http://lady.shaoqun.com/a/103453.html
阿里国际站店铺排序提升排名技巧:https://www.ikjzd.com/articles/140505
央视调查:订单多利润少!美元账户一夜蒸发几十万!怎么回事?:https://www.ikjzd.com/articles/140525
暴风雪致机场封锁,欧洲大面积物流延误!:https://www.ikjzd.com/articles/140477
克雷格:https://www.ikjzd.com/w/194
怎样谈恋爱:http://lady.shaoqun.com/a/47704.html
强壮的公么让我次次高潮 口述我和公忍不住发生了关系:http://lady.shaoqun.com/a/247590.html
张震的故事女孩洗脸:人性的救赎:http://www.30bags.com/a/437878.html
仙栖洞风景区门票优惠政策:(儿童+老人+学生等):http://www.30bags.com/a/437879.html
在夫妻生活中,掌握这六个窍门可以提高幸福指数:http://www.30bags.com/a/437880.html

No comments:

Post a Comment