Распределение ресурсов при использовании статических элементов - PullRequest
0 голосов
/ 04 сентября 2011

Рассмотрим ситуацию, когда у нас есть класс с парой статических методов, которые используют один статический объект.

public class Person
{
    private static PresonActions actions = new PresonActions();

    public static void Walk()
    {
        actions.Walk();
    }
}

Я знаю, что жизненный цикл статических членов в приложениях asp.net равен жизненному циклу домена приложения. Таким образом, это означает, что объект не уничтожен, а ресурсы не освобождены, пока я не перезапущу домен приложения.

Но если мы будем использовать свойство для создания экземпляра класса PresonActions при каждом обращении к нему, будет ли объект уничтожен или нет?

public class Person
{
    private static PresonActions actions { get { return new PresonActions(); } }

    public static void Walk()
    {
        actions.Walk();
    }
}

спасибо.

Ответы [ 2 ]

2 голосов
/ 04 сентября 2011

Непрерывное распределение статических переменных - Зло.Следите за потреблением памяти, особенно если вы говорите о серверном компоненте (ASP.NET).

Чтобы ответить на ваш вопрос: GC собирает , когда он может объект, на который больше никто не ссылается в приложении.

Не делай этого.При таком подходе очень легко прыгнуть в проблемы с памятью и после нескольких часов проводить профилирование и обнаруживать утечки памяти.

Если вы хотите изменить содержимое объекта, напишите функцию, которая обновляет содержимое объекта, не создавая новый экземплярэто.

0 голосов
/ 04 сентября 2011

Во втором примере кода сборщик мусора уничтожит объект через некоторое время после вызова actions.Walk(). Сборщик мусора делает это недетерминированным образом, то есть вы не можете определить, когда он выполнит эту операцию.

Если ваш тип использует ресурсы, которые вы хотите утилизировать детерминистически, тогда тип должен реализовывать IDisposable, а реализация метода Dispose должна выполнять удаление этих ресурсов.

Потребляющий код может затем вызвать этот метод напрямую или использовать блок using для удаления объекта, который, в свою очередь, избавляется от своих ресурсов.

например: -.

public class PresonActions : IDisposable
{
    ...
    public void Dispose()
    {
        ...
    }
}

public class Person
{
    public static void Walk()
    {
        using(var actions = new PresonActions())
        {
            actions.Walk();
        }
    }
}

Обратите внимание, что, поскольку вы не используете экземпляр более чем для одного вызова метода, нет смысла создавать его в статическом свойстве. Его можно создать в методе, который позволяет использовать блок using.

...