2015-10-30 2 views
5
объект

PetaPoco.Database реализует IDisposable, но я редко, если когда-нибудь увидеть примеры кода (в том числе на PetaPoco-х own website), которые включают в себя, используя заявление следующим образом:PetaPoco.Database реализует IDisposable, поэтому почему большинство примеров не имеют инструкции 'using'?

using (var db = new Database("MyConnectionString")) 
{ 
    // Do database stuff 
} 

Чаще всего я просто вижу:

var db = new Database("MyConnectionString"); 
// Do database stuff 
// I never see .Dispose() called. 

Как должны быть переданы объекты PetaPoco.Database?

+0

Если он реализует IDisposable, вы должны обязательно вызвать Dispose. И, в любом случае, вам нечего терять, если метод Dispose ничего не делает – Steve

+0

Но если IDisposable реализован, тогда я не должен помещать его в блок «using», так как это обычно означает, что «использование» предназначено для использоваться? – Howiecamp

+0

@Howiecamp Это так и должно. они не делают этого в примерах, потому что GC заботится об этом, когда «AppDomain» уничтожается программой. – Behrooz

ответ

-2

IDisposable сообщает GC что делать, когда он хочет избавиться от object.
using запрашивает GC, чтобы избавиться от object, когда его объем заканчивается.
с использованием using с object это не IDisposable бесполезно.

+0

Но PetaPoco.Database *. * Поддержка IDisposable. – Howiecamp

+0

@Howiecamp Это не против того, что я сказал. см. мой другой комментарий выше. Я просто указал 3 очка. – Behrooz

+0

Но так как объект * делает * реализует IDisposable, в чем смысл комментария об использовании использования с объектами, которые * не реализуют IDisposable? – Howiecamp

0

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

Если вы реализуете веб-решения на базе, обычно используется один объект базы данных для каждого запроса, но запрос, конечно, выполнить несколько операторов SQL в различных фильтрах, глобальных фильтрах и методах несколько контроллера, так что вы не можете использовать Using

3

Как правило: если класс реализует IDisposable, то перейдите и оберните его при использовании. Возможно, на самом деле они не могут использовать неуправляемые ресурсы, но это не повредит и может в будущем не дать вам никаких изменений.

+1

Не могу договориться подробнее! Тем не менее, некоторые API-интерфейсы используют утилиту для сахара-силиката, который при таком использовании должен быть хорошо документирован. Я добавлю примечание, чтобы добавить это для PetaPoco. – Plebsori

1

PetaPoco сопровождающий здесь. Dispose - это то же самое, что и вызов CloseSharedConnection(). Однако синтаксис C# поддерживает только (...) с IDisposable. Например, IDBConnection, из памяти, поддерживает как Close, так и Dispose.

В основном, это сводится к выбору

Пример 1

using(var db = new PetaPoco()) 
{ 
    // some code 
} 

Пример 2

var db = new PetaPoco() 

try 
{ 
    // code 
} 
finally 
{ 
    db.CloseSharedConnection(); 
} 
0

ГК называет Object.Finalize. IDisposable не вызывается GC, его нужно вызывать вручную. GC не имеет ничего общего с using и IDisposable

Смежные вопросы