【问题标题】:C# interview questionC#面试题
【发布时间】:2011-04-08 16:55:12
【问题描述】:

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

您有以下 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?

【问题讨论】:

  • 快吗?你现在在面试吗?
  • 如果 Ticks % 10 != 0 _value 将为空。你取消引用它。

标签: c# asp.net


【解决方案1】:

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

虽然 .NET 1.1 对后台线程中抛出的异常有一定的容忍度,这些异常已被消耗并且不会导致托管进程停止,但从 CLR 2.0 开始不再是这种情况。 Quote from the doc:

如果 Finalize 或 Finalize 的覆盖 抛出异常,运行时 不是由应用程序托管的 覆盖默认策略, 运行时终止进程并且没有 活跃的 try-finally 块或 终结器被执行。这种行为 确保过程完整性,如果 终结器无法释放或销毁 资源。

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

【讨论】:

    猜你喜欢
    • 2011-03-04
    • 2011-05-28
    • 2011-01-26
    • 2010-11-03
    • 1970-01-01
    • 2012-01-08
    • 1970-01-01
    • 1970-01-01
    • 2011-05-15
    相关资源
    最近更新 更多