2016-04-26 10 views
-1

Является ли это правильным шаблоном, например, если у моего класса есть одноразовые члены, я должен явно называть Dipose()?Если мой класс имеет член SqlConnection (или другой одноразовый), должен ли он реализовать IDisposable?

class MyClass : IDisposable 
{ 
public MyClass() 
{ 
    conn = maybeCreateAConnection(); 
} 
public void Dispose() 
{ 
    if(conn!=null)conn.Dispose(); 
} 

private SqlConnection conn; 
} 
+1

[Dispose Pattern] (https://msdn.microsoft.com/en-us/library/b1yfkh5e (v = vs.110) .aspx), сначала ** DO ** - "** DO ** реализовать Basic Dispose Pattern на типах, содержащих экземпляры одноразовых типов " –

+1

Я бы бросил вызов, почему вам нужен _member_ для подключения - необходимо быстро создавать, использовать и удалять соединения. Существует редко убедительная причина иметь живое соединение в течение всего класса. –

+0

@Damien_The_Unbeliever Кажется, kludgy, больше похоже на C++, чтобы помнить, какие поля одноразовые! –

ответ

2

Да. Но только если класс является владельцем указанного ресурса. Вы не хотите удалять соединение, которое использует кто-то другой.

И это, кстати, не имеет никакого отношения к сборщику мусора.

+0

Почему? Удалите тег, если хотите, хотя похоже, что это обман. –

+1

@ Mr.Boy 'Dispose' - это просто метод, подобный любому другому, он не имеет никакого отношения к сборщику мусора. GC заботится только о ссылках и финализаторах. Финализатор * может * вызывать метод 'Dispose', но это не имеет значения - он может также вызвать любой другой метод, если он безопасен. – Luaan

+0

Сборщик мусора - это причина .NET _has_ 'IDisposable'. Если бы у нас не было управляемой памяти и не было выпущено все ресурсы вручную, не было бы необходимости в 'IDisposable' - она ​​просто зашла бы в деструктор (финализатор). –