do we need to dispose screen controls?

  • Thread starter Thread starter Batterhead
  • Start date Start date
B

Batterhead

hi there,

i use vs2005, c# and .netcf2. i know that i have to explicitly dispose
any controls and components which created by myself. but how about
those controls, e.g. button, which drew by c# on the screen. as a good
practice, should i dispose them explicitly? or c# already does it for
me with the system generated code? where is the code?

i know they will be handled eventually by GC but it does not
guaranteed.

thanks
batterhead
 
If they are part of the Controls collection in a Form, then the Form will
dispose of them for you.
 
Just ensure you call dispose on your form. It is good practice to use the
using statement. ie: in C#:

using (MyForm form = new MyForm())
{
form.ShowDialog();
}

When control leaves the above block, the CLR will call Dispose on that form.
When creating a form via the Wizard, it will override the Dispose method of
the Component class and call Dispose on this for you. It overrides to clean
up the components object and so you can place stuff in there if you want.

You can find this in the designer partial class. ie MyForm.designer.cs.
 
Simon said:
Just ensure you call dispose on your form. It is good practice to use the
using statement. ie: in C#:

using (MyForm form = new MyForm())
{
form.ShowDialog();
}

This doesn't compile, at least for me anyway (VS2003)

using (Form form = new Form ())
{}

Also, "(new Form () is IDisposable)" is false.

What am I doing wrong?

Hilton
 
Chris,

"using" is definitely a 1.0 keyword. I use it all the time; e.g. "using
(StreamReader sr = new StreamReader (...))". The problem is that Form does
not implement IDisposable on CF 1. Now if Form all of a sudden does
implement IDisposable, then that is, by Microsoft's definition, "a breaking
change" and should not be done.

"(new Form () is IDisposable) return false on CF 1.0, but true on .NET
(desktop).

Interesting... Seems like a major screwup/oversight by Microsoft. Yes?

That's why I still think that the GC should have: "if o implements
IDisposable && (!o.Disposed) then o.Dispose" (pseudo code). But I was shot
down last time and I guess I will be again. So, Form does not implement
IDisposable on the Compact Framework - solve that. If it is in CF 2.0, that
is a breaking change and should not be done (according to Microsoft).

Comments?

Hilton
 
I just checked CF 1.0, 2.0 and 3.5 with Reflector and a Form is definitely
derived from IDisposable in all three.

Form->ContainerControl->ScrollableControl->Control->Component->IComponent->IDisposable


--

Chris Tacke, eMVP
Join the Embedded Developer Community
http://community.opennetcf.com
 
Chris,
I just checked CF 1.0, 2.0 and 3.5 with Reflector and a Form is definitely
derived from IDisposable in all three.

Form->ContainerControl->ScrollableControl->Control->Component->IComponent->IDisposable

OK, so:

Q1: Why does:

using (Form form = new Form()) {}

give the following compiler error:

c:\test\FormDispose\Form1.cs(32): Cannot implicitly convert type
'System.Windows.Forms.Form' to 'System.IDisposable'


....and..

Q2: Why does: "(new Form () is IDisposable)" return false?

Q1 is a compile time check, Q2 is a run-time and they're consistent.

Hilton
 
To follow-up my own post:

When I run (FormDispose.exe) with the line:

"MessageBox.Show (((new Form () is IDisposable).ToString()));"

it returns *false*. This is using CF 1.

Then I add the file FormDispose.exe.config so that FormDispose uses CF 2 and
guess what? Yip, it returns *true*.

Believe it, or not...

Hilton
 
Well you have to believe the runtime. I can only conclude that I'm looking
at the wrong 1.0 binary (or at least not the one your system is using).
What version of 1.0 are you running?


--

Chris Tacke, eMVP
Join the Embedded Developer Community
http://community.opennetcf.com
 
CF 1.0.4292.0 which is CF1 SP3

Try it, create a Pocket PC, add the line below and on CF 1, it shows false
(and using doesn't compile either).

Hilton
 
Back
Top