C#面试问题

use*_*046 9 c# asp.net

这是我需要帮助的面试问题.

您有以下ASP.NET代码隐藏类:

public partial class Page1 : Page 
{
    private string _value;

    public Page1() 
    {
        if (DateTime.Now.Ticks % 10 == 0)
            _value = "Test";
    }       

    ~Page1() 
    {
        if(_value.Equals("Test"))
            _value = string.Empty;      
    }
}
Run Code Online (Sandbox Code Playgroud)

只要有人请求此页面,该w3wp.exe过程就会意外终止.

  • 为什么会发生这种情况而不是用户看到黄色的死亡屏幕(默认的ASP.NET错误页面)?

  • 为什么托管堆上总是存在OutOfMemoryException?

Dar*_*rov 18

提示:永远不要在析构函数/终结器中抛出异常,否则你将终止GC运行的线程,没有GC可能会变得丑陋.

虽然.NET 1.1中存在一些容忍度,但是在后台线程中抛出的异常被消耗掉并且不会导致托管进程失效,从CLR 2.0开始不再是这种情况.从文档引用:

如果Finalize或Finalize的覆盖引发异常,并且运行时不由覆盖默认策略的应用程序托管,则运行时将终止该进程,并且不会执行活动的try-finally块或终结器.如果终结器无法释放或销毁资源,则此行为可确保进程完整性.

在终结器中抛出异常是致命的.