Как правильно использовать статическое свойство, которое реализует IDisposable? - PullRequest
4 голосов
/ 15 июня 2009

Как пример:

using (Brushes.Black)
{
...
}

не очень хорошая идея, потому что она статическая. В следующий раз, когда ваше приложение перейдет к использованию Brushes.Black, у вас будут проблемы, потому что оно было удалено.

Теперь, если вы используете только Brushes.Black, тогда, вероятно, нормально не распоряжаться им, потому что вы оставляете только один неуправляемый ресурс (надеюсь!) Вокруг.

Но в целом следует избегать использования большого количества статических IDisposables, или я что-то упускаю?

Ответы [ 2 ]

3 голосов
/ 15 июня 2009

Обычно просто используйте их, и пусть каркасный класс беспокоится об их утилизации.

Они существуют для того, чтобы вы могли использовать их, не создавая и не утилизируя их каждый раз. Каждый из них создается при первом его использовании и кэшируется в хэш-таблице. Класс Framework отвечает за их правильное удаление при закрытии приложения.

На самом деле не так много статических IDisposables, о которых вам нужно беспокоиться. Если бы вы использовали очень много кистей, вы все равно могли бы создать их из цвета в цикле (и тогда вы бы, конечно, отвечали за их удаление).

2 голосов
/ 15 июня 2009

Как пример:

с использованием (Brushes.Black) {...}

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

Это не просто статическое поле - свойство активно запускает код для создания новых экземпляров при необходимости. Просто посмотрите на соответствующий код ( Отражатель ):

public static Brush Black
{
    get
    {
        Brush brush = (Brush) SafeNativeMethods.Gdip.ThreadData[BlackKey];
        if (brush == null)
        {
            brush = new SolidBrush(Color.Black);
            SafeNativeMethods.Gdip.ThreadData[BlackKey] = brush;
        }
        return brush;
    }
}
...