Вопрос для собеседования на C #

#c# #asp.net

#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. быстро? Вы сейчас на собеседовании?

2. И если установить флажок % 10 != 0, то _value будет равно null. Вы разыменовали его.

Ответ №1:

Подсказка: никогда не создавайте исключения в деструкторе / финализаторе, иначе вы уничтожите поток, в котором выполняется GC, а без GC все может стать некрасиво.

Хотя в .NET 1.1 существовала некоторая терпимость к исключениям, создаваемым в фоновых потоках, которые были использованы и не привели бы к остановке процесса хостинга, начиная с CLR 2.0 это больше не так. Цитата из документа:

Если Finalize или переопределение Finalize генерирует исключение, а среда выполнения не размещена приложением, которое переопределяет политику по умолчанию, среда выполнения завершает процесс, и никакие активные блоки try-finally или завершающие средства не выполняются. Такое поведение обеспечивает целостность процесса, если завершитель не может освободить или уничтожить ресурсы.

Исключение в финализаторе является фатальным.