c#面试问题

本文关键字:问题 面试 | 更新日期: 2023-09-27 17:49:23

这是一个我需要帮助的面试问题。

您有以下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存在于托管堆上?

c#面试问题

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

虽然在。net 1.1中对后台线程抛出的异常有一定的容错,但从CLR 2.0开始,这种情况就不再存在了。引用自文档:

如果Finalize或Finalize的重写抛出异常和运行时不是由应用程序托管的覆盖默认策略运行时终止进程活动的try-finally阻止或终结器被执行。这种行为确保过程完整性,如果终结器不能释放或销毁资源。

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