C#面试问题

时间:2011-04-08 16:55:12

标签: 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;      
    }
}

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

  • 为什么会出现这种情况,而用户会看到黄色死机屏幕(默认的ASP.NET错误页面)?

  • 为什么托管堆上始终存在OutOfMemoryException?

1 个答案:

答案 0 :(得分:18)

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

虽然.NET 1.1中存在一些容忍,但是在后台线程中抛出的异常被消耗掉并且不会使托管进程失效,从CLR 2.0开始不再是这种情况。 Quote from the doc

  

如果Finalize或覆盖Finalize   抛出异常和运行时   不是由应用程序托管的   覆盖默认策略   运行时终止进程,没有   积极的尝试 - 终结块或   终结者被执行。这种行为   确保过程完整性   终结者无法释放或毁灭   资源。

在终结者中抛出异常是致命的。