Можно ли принудительно использовать оператор using в C#

StackOverflow https://stackoverflow.com/questions/751016

  •  09-09-2019
  •  | 
  •  

Вопрос

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

Это было полезно?

Решение

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

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

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

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

Другие советы

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

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

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

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

ссылка Когда мне нужно реализовать финализатор или IDisposable? или техническая болтовня:Использование Dispose, Финализаторов и IDisposable

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top