Това, което сте публикували, е частично модел за изхвърляне. Както някой посочи, трябва да има съответен Dispose(false)
във финализатор ("деструктор"). Финализаторът трябва да се използва за изхвърляне на неуправлявани ресурси. Ако нямате неуправляеми ресурси, с които да се справите (т.е. нямате какво да правите, когато disposing
е false
), нямате нужда от Dispose(false)
и следователно не се нуждаете от финализатор. Това означава, чеDispose(true)
е единственият път, така че не се нуждаете от Dispose (bool)
(и следователно не е необходимо да прилагате шаблона за изхвърляне) и можете да преместите тялото му в Dispose
(и да премахнете отметката за disposing
) и просто да внедрите Dispose
. Например:
public void Dispose()
{
_context.Dispose();
}
Класовете, които не имплементират собствен финализатор (деструктор), не се поставят в списъка на финализаторите, така че няма нужда да се извиква GC.SuppressFinalize
.
Като цяло това е достатъчно, ако създавате клас. Но понякога можете да извлечете от класове, които прилагат този модел. В който случай трябва да внедрите поддръжка за него във вашия клас (заменете Dispose(bool)
и направете disposing
проверка и Dispose
на всички управлявани ресурси). Тъй като базовият клас имплементира IDisposable
и извиква virtual Dispose(bool)
в своя Dispose()
, не е нужно да внедрявате Dispose()
сами, но трябва да извикате Dispose(bool)
на базата във вашия Dispose(bool)
. Например:
protected override void Dispose(bool disposing)
{
if(disposing) _context.Dispose();
base.Dispose(disposing);
}
Ако се обаждате в базата и тя е имплементирала Dispose Pattern, тогава също не е необходимо да извиквате GC.SuppressFinalize()
, защото тя вече го прави.
Можете да направите цялото disposed
нещо, ако искате; Намирам обаче, че крие многофункционални грешки.
person
Peter Ritchie
schedule
26.08.2012
SafeHandle
като директен собственик на неуправляваните ресурси и простDispose
метод без финализатор като непряк собственик. - person CodesInChaos   schedule 26.08.2012