> Common sense would suggest that if you need a Dispose()
> method then you should implement a finaliser too, to perform the same

In most circumstances (but not all) -- this is true. Most of the time,
option dispose+finalizer code pattern would be preferred to the dispose only
code pattern. There are (seemingly rare in my code) some uses for option 3
as Eric Gunnerson pointed out.

Execution of the Dispose method (e.g. sqlConnection.Dispose as shown below)
is guaranteed by convention not to throw exceptions (no matter how many
times you call it, or even when you call it). If you implement IDisposable
on your own classes, then you are "obligated" (by convention) to prevent
your Dispose method from throwing exceptions too. The fact that you still
have code that can reach the object (sqlConnection.Dispose is executable
code) seems to mutually exclude the object being already disposed before you
try to call Dispose on it. :~} Perhaps I missed the full context of the
point that you were trying to make, but that's how I read the post.

--Paul Mehner


-----Original Message-----
From: Unmoderated discussion of advanced .NET topics.
[mailto:[EMAIL PROTECTED] On Behalf Of Julian Everett
Sent: Wednesday, January 26, 2005 4:12 AM
To: [email protected]
Subject: Re: [ADVANCED-DOTNET] Disposing of objects

clean-up in the instance that Dispose() is not called explicitly. In other
words you should always choose (2) over (3).

However, the problem arises because Finalizable objects are finalised in a
non-deterministic manner. As a result, if you try to call a method on a
non-static Finalizable type (e.g. sqlConnection.Dispose()) from within a
finaliser and there is any chance the referenced object could be in the same
finalisation object graph, then the referenced object might well have been
finalised already - which would result in an exception being thrown.

That's why you can do nothing useful to wrapped resources from within a
finaliser, at least as I understand it.

cheers

Julian


-----Original Message-----
From: Unmoderated discussion of advanced .NET topics.
[mailto:[EMAIL PROTECTED] Behalf Of Ian Griffiths
Sent: 26 January 2005 11:43
To: [email protected]
Subject: Re: [ADVANCED-DOTNET] Disposing of objects


One thing that's worth making clear is that for any given class you have
three choices:

(1) Don't implement IDisposable at all
(2) Implement the Dispose pattern you've shown here (or something like
it)
(3) Implement IDisposable, but don't have a finalizer

Because the docs focus so heavily on the dispose pattern (option 2),
it's not uncommon for people who are new to this not to realise the (3)
is even an option.  This is unfortunate because, as it happens, it's
often the most important option.  It's certainly appropriate more often
than (2).

The fact is that very few classes need the full dispose pattern.
Specifically, the finalization stuff is only required if your class
*directly* manages raw handles, or handle-like things.  (E.g., anything
represented as an IntPtr.)

Most classes don't actually wrap raw handles directly.

But *lots* of classes wrap them indirectly.  If you're wrapping other
objects that implement IDisposable (such as a SqlConnection), then you
too should implement IDisposable, but there's no need to have a
finalizer.  (So that would be option 3 above.)


You seem to be proposing option 2 on *all* classes.  Option 2 should in
fact be the least common - for most classes, either 1 or 3 will be more
appropriate.  So I'd say definitely *don't* implement that pattern
you've shown on all classes.

Microsoft seem to push 2 too heavily.  For example, as someone else
pointed out, they say:

"Implement the dispose design pattern on a type that encapsulates
resources that explicitly need to be freed. Users can free external
resources by calling the public Dispose method."

If you take this literally, it includes things like SqlConnection and
FileStream - those need to be freed explicitly with a call to Close or
Dispose.

You really don't need the full Dispose pattern (i.e., with a finalizer
and two Dispose methods) in that case.  And that's the most common case,
so it's a shame they tell you to use the full Dispose pattern...  The
fact is that there's nothing useful you can do to such resources in your
finalizer.


--
Ian Griffiths - DevelopMentor
http://www.interact-sw.co.uk/iangblog/

> -----Original Message-----
> From: Knowlton, Gerald F.
>
> Greetings:
>
> We are having somewhat of a lengthy discussion going on here regarding
the
> disposing of objects.
>
> One camp wants to put the following code into all classes:
>
> Private Disposed as Boolean
> .
> .
> .
> Public sub Dispose() Implements IDisposable.Dispose
>         Dispose(True)
>         GC.Suppressfinalize(me)
> End sub
>
> Protected Sub Dispose(ByVal Disposing as Boolean)
>         If Disposed then Exit Sub
>         If Disposing then DisposeOfObjects
> End Sub
>
> Private Sub Dispose of Objects
>         <object_name> = nothing
> End Sub
>
>
> While the other camp says it is not needed unless the class has
unmanaged
> resources.
>
> Our question is; which would be the better practice?
>
> Best regards,
>
>
> Jerry
>
> ==================================================================
> All BWXT, Inc.  Email communications are subject to auditing for
> adherence to company policy pertaining to waste, fraud and abuse.
> Misuse of the e-mail system is cause for disciplinary action.
> ==================================================================
>
> ===================================
> This list is hosted by DevelopMentor(r)  http://www.develop.com
>
> View archives and manage your subscription(s) at
> http://discuss.develop.com

===================================
This list is hosted by DevelopMentorR  http://www.develop.com

View archives and manage your subscription(s) at http://discuss.develop.com

_____________________________________________________________________
This message has been checked for all known viruses by Star Internet
delivered
through the MessageLabs Virus Control Centre. For further information visit
http://www.star.net.uk/stats.asp


IMPORTANT NOTICE
This communication contains information, which is confidential and may also
be privileged. It is for the exclusive use of the intended recipients(s). If
you are not the intended recipient(s) please note that any form of
distribution, copying or use of this communication or the information in it
is strictly prohibited and may be unlawful. If you have received this
communication in error please return it to the sender. The opinions
expressed within this communication are not necessarily those expressed by
Teletext Ltd.

Teletext Ltd.
Building 10
Chiswick Park
566 Chiswick High Road
London W4 5TS

Registered in England number 2694814

_____________________________________________________________________
This message has been checked for all known viruses by Star Internet
delivered
through the MessageLabs Virus Control Centre. For further information visit
http://www.star.net.uk/stats.asp

===================================
This list is hosted by DevelopMentorR  http://www.develop.com

View archives and manage your subscription(s) at http://discuss.develop.com

===================================
This list is hosted by DevelopMentor�  http://www.develop.com

View archives and manage your subscription(s) at http://discuss.develop.com

Reply via email to