Возможно ли навязать использование оператора using в C # - PullRequest
6 голосов
/ 15 апреля 2009

Очень хотелось бы иметь возможность украсить мой класс каким-либо атрибутом, который бы принудительно использовал использование оператора using, чтобы класс всегда был безопасно удален и избежал утечек памяти. Кто-нибудь знает такую ​​технику?

Ответы [ 3 ]

13 голосов
/ 15 апреля 2009

Что ж, есть только один способ сделать это - разрешить доступ к вашему объекту только через статический метод, который принимает делегата. В качестве очень упрощенного примера (поскольку очевидно, что существует много разных способов открытия файла - чтение / запись и т. Д.):

public static void WorkWithFile(string filename, Action<FileStream> action)
{
    using (FileStream stream = File.OpenRead(filename))
    {
        action(stream);
    }
}

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

Эта техника, конечно, сильно ограничивает то, что вы можете делать со своим объектом - но в некоторых случаях это может быть полезно.

3 голосов
/ 15 апреля 2009

Вы можете использовать FxCop для применения этого правила. См. Википедию для краткого обзора .

0 голосов
/ 15 апреля 2009

Если вы хотите, чтобы ваш объект всегда был удален, используйте финализатор в сочетании с IDisposable.

Но прежде чем вы это сделаете, ознакомьтесь с IDisposable и финализаторами и осознайте тот факт, что они обычно вам не нужны, если ваш класс не делает что-то вроде управления временем жизни неуправляемого ресурса.

С помощью финализатора ваш объект будет возвращен «в конце концов», независимо от того, завернут ли он в использование или нет. Оператор using, который удобен для IDisposable, позволяет выполнять детерминированную очистку. Единственное предостережение в том, что очистка объекта с финализаторами обходится дороже и, как правило, дольше остается в памяти, ожидая завершения.

ref Когда мне нужно реализовать финализатор или IDisposable? или же technorabble: использование утилизации, финализаторов и IDisposable

...