GC не собирает объект со слабой ссылкой при наличии лямбда-выражения / анонимного делегата в режиме отладки - PullRequest
0 голосов
/ 26 августа 2018

Рассмотрим следующий автономный фрагмент C #:

using System;

namespace ConsoleApp1
{
    class Program
    {
        static void Main()
        {
            var wr = new WeakReference(new object());
            GC.Collect(GC.MaxGeneration, GCCollectionMode.Forced, true, true);
            Console.WriteLine(wr.IsAlive);
            GC.KeepAlive((Action)(delegate { })); // ***
        }
    }
}

Проект ориентирован на .NET Framework 4.6.1, созданный с помощью Visual Studio 2017 Community версии 15.7.2.(Используйте шаблон консольного приложения по умолчанию.)

  • Когда я собираю проект в Debug / Any CPU (по умолчанию), результат равен True.
  • Когда я его строюОтпустите / Любой ЦП, результат будет False.
  • Когда закомментируйте строку с ***, результат всегда будет False.
  • Мой базовый анализ с достижимостью объекта говоритрезультат всегда должен быть False.

Почему GC не собирает объект со слабой ссылкой?Я что-то упускаю, например, что-то необычное может произойти в режиме отладки?

Примечания:

  1. Этот вопрос не является дубликатом этого вопроса , поскольку этот вопрос касается сбора мусора COM-объектов, который включает взаимодействие и подсчет ссылок (в COM).В отличие от этого, этот вопрос является чисто проблемой GC в CLR.Эта проблема также важнее этой проблемы.
...