Подтвердить что ты не робот

Странное поведение WeakReference на Mono

Тестирование кода, использующего WeakReference, не помогло мне использовать Mono 2.11.3 (SGen), а также стабильную версию 2.10.8. В простом коде, подобном этому

object obj = new object();
WeakReference wr = new WeakReference(obj);

Assert.IsTrue(wr.IsAlive);

obj = null;
GC.Collect();

Assert.IsFalse(wr.IsAlive);

второе утверждение будет терпеть неудачу. Добавление GC.WaitForPendingFinalizers не помогает. Это ошибка в Моно или в моей голове? Благодаря

4b9b3361

Ответ 1

Это не ошибка, а деталь реализации, где Mono GC ведет себя иначе, чем MS GC. В этом случае, поскольку вы создали объект obj в том же стеке стека, он, как правило, поддерживается в режиме консервативного кода сканирования стека. В реальном коде (в отличие от тривиальных тестовых случаев, подобных этому) это не проблема. Если для вашего конкретного случая это, я предлагаю выделить объект и его WeakReference в отдельном методе:

static WeakReference Alloc ()
{
    return new WeakReference (new object ());
}

Ответ 2

[MethodImpl((MethodImplOptions.NoInlining)]
static WeakReference Alloc ()
{
    return new WeakReference (new object ());
}

Должен гарантировать, что метод Alloc() не будет встроенным при компиляции