473,236 Members | 1,697 Online
Bytes | Software Development & Data Engineering Community
Post Job

Home Posts Topics Members FAQ

Join Bytes to post your question to a community of 473,236 software developers and data experts.

Bug in .NET 1.1?

The following code is causing the exception
"System.InvalidOperationException: Handle is not initialized". From my
understanding, objects in a class are expected to be valid during the
destructor.

This is causing the exception (note, if you explicitly call m.Close(),
this does not happen):

public class DbManager {
private readonly SqlConnection con;

public DbManager() {
con=new SqlConnection("Data Source=<source>; User ID=<user>;
Password=<password>;Initial Catalog=<database>");
Open();
}

~DbManager() {
Close();
}

public void Open() {
con.Open();
}

public void Close() {
con.Close();
}
}

static void Main(string[] args) {
DbManager m=new DbManager();
}

Jul 21 '05 #1
3 2327
hi Cory......

The programmer has no control on when the destructor is going to be executed
because this is determined by the Garbage Collector. The garbage collector
checks for objects that are no longer being used by the application. It
considers these objects eligible for destruction and reclaims their memory.
Destructors are also called when the program exits. When a destructor
executes what is happening behind the scenes is that the destructor
implicitly calls the Object.Finalize method on the object's base class.
Therefore, the preceding destructor code is implicitly translated to:

protected override void Finalize()
{
try
{
// Cleaning up .
}
finally
{
base.Finalize();
}
}
Now, let us look at an example of how destructors are called. We have three
classes A, B and C. B is derived from A, and C is derived from B. Each class
has their own constructors and destructors. In the main of the class App, we
create an object of C.

using System;
class A
{
public A()
{
Console.WriteLine("Creating A");
}
~A()
{
Console.WriteLine("Destroying A");
}
}

class B:A
{
public B()
{
Console.WriteLine("Creating B");
}
~B()
{
Console.WriteLine("Destroying B");
}

}
class C:B
{
public C()
{
Console.WriteLine("Creating C");
}

~C()
{
Console.WriteLine("Destroying C");
}
}
class App
{
public static void Main()
{
C c=new C();
Console.WriteLine("Object Created ");
Console.WriteLine("Press enter to Destroy it");
Console.ReadLine();
c=null;
//GC.Collect();
Console.Read();
}

}
As we expect, the constructors of base classes will be executed and program
will wait for the user to press 'enter'. When this occurs, we set the object
of class C to null. But the destructors are not executing ..!!?? As we
already said, the programmer has no control on when the destructor is going
to be executed because the Garbage Collector determines this. But the
destructors are called when the program exits. You can check this by
redirecting the o/p of the program to a text file. I have the output here.
Notice that the destructors of the base classes are called because behind the
scenes base.Finalize() is called.

Creating A
Creating B
Creating C
Object Created
Press enter to Destroy it
Destroying C
Destroying B
Destroying A
So, what do you do if you want to call the destructors once you are finished
using the object? There are two ways:

Call the Garbage collector to clean up.
Implement Dispose method of IDisposable interface.

Hope this helps in why explicitly calling m.close() does not raise the error
and moreover check these hints also.

Note 1: Do not use destructor if your class does not use native / unmanaged
resources. If you do so, you create unnecessary work for the garbage
collector.

Note 2: If you implement the IDisposable and a destructor, you should call
the Dispose method from the destructor to force the object to release
resources immediately.

Hope the above explanation might be useful for you.
Regds
Kannan.V

"Cory Nelson" wrote:
The following code is causing the exception
"System.InvalidOperationException: Handle is not initialized". From my
understanding, objects in a class are expected to be valid during the
destructor.

This is causing the exception (note, if you explicitly call m.Close(),
this does not happen):

public class DbManager {
private readonly SqlConnection con;

public DbManager() {
con=new SqlConnection("Data Source=<source>; User ID=<user>;
Password=<password>;Initial Catalog=<database>");
Open();
}

~DbManager() {
Close();
}

public void Open() {
con.Open();
}

public void Close() {
con.Close();
}
}

static void Main(string[] args) {
DbManager m=new DbManager();
}

Jul 21 '05 #2
Thankyou for answering quick, but I'm afraid you didn't understand the
problem.

Putting destructors being unpredictable and sometimes hard on the GC
aside, this is still code that shoudn't be raising exceptions. "con"
should not be mucked with by the GC until the destructor of DbManager
is called.

Jul 21 '05 #3
Hi Cory,

As Kannan said, the behaviour is the correct one. Why? The GC guaranties
only that the destructor is called, if you have one, but does not guarantee
the order in which your destructors will be called. And I will explain why
this behaviour. When your DbManager object is no longer refferenced in your
programm, your object will become unreacheble, but you will still have one
refference to it, in the Finalize Q. And because con is referenced only by
DbManager, will be unreachable as well but will have one refference to it,
in the Finalize Q. And because of that you don't have a guarantee that your
con wasn't already destroied when you try to Close it. Because you have a
destructor in con, then you will not need one in DBManager, if con is the
only resource you are using in your DBManager.

Regards,

Tiberiu Covaci

"Cory Nelson" <ph*****@gmail.com> wrote in message
news:11*********************@o13g2000cwo.googlegro ups.com...
Thankyou for answering quick, but I'm afraid you didn't understand the
problem.

Putting destructors being unpredictable and sometimes hard on the GC
aside, this is still code that shoudn't be raising exceptions. "con"
should not be mucked with by the GC until the destructor of DbManager
is called.

Jul 21 '05 #4

This thread has been closed and replies have been disabled. Please start a new discussion.

Similar topics

3
by: William C. White | last post by:
Does anyone know of a way to use PHP /w Authorize.net AIM without using cURL? Our website is hosted on a shared drive and the webhost company doesn't installed additional software (such as cURL)...
2
by: Albert Ahtenberg | last post by:
Hello, I don't know if it is only me but I was sure that header("Location:url") redirects the browser instantly to URL, or at least stops the execution of the code. But appearantely it continues...
3
by: James | last post by:
Hi, I have a form with 2 fields. 'A' 'B' The user completes one of the fields and the form is submitted. On the results page I want to run a query, but this will change subject to which...
0
by: Ollivier Robert | last post by:
Hello, I'm trying to link PHP with Oracle 9.2.0/OCI8 with gcc 3.2.3 on a Solaris9 system. The link succeeds but everytime I try to run php, I get a SEGV from inside the libcnltsh.so library. ...
1
by: Richard Galli | last post by:
I want viewers to compare state laws on a single subject. Imagine a three-column table with a drop-down box on the top. A viewer selects a state from the list, and that state's text fills the...
4
by: Albert Ahtenberg | last post by:
Hello, I have two questions. 1. When the user presses the back button and returns to a form he filled the form is reseted. How do I leave there the values he inserted? 2. When the...
1
by: inderjit S Gabrie | last post by:
Hi all Here is the scenerio ...is it possibly to do this... i am getting valid course dates output on to a web which i have designed ....all is okay so far , look at the following web url ...
2
by: Jack | last post by:
Hi All, What is the PHP equivilent of Oracle bind variables in a SQL statement, e.g. select x from y where z=:parameter Which in asp/jsp would be followed by some statements to bind a value...
3
by: Sandwick | last post by:
I am trying to change the size of a drawing so they are all 3x3. the script below is what i was trying to use to cut it in half ... I get errors. I can display the normal picture but not the...
3
isladogs
by: isladogs | last post by:
The next Access Europe meeting will be on Wednesday 3 Jan 2024 starting at 18:00 UK time (6PM UTC) and finishing at about 19:15 (7.15PM). For other local times, please check World Time Buddy In...
0
by: jianzs | last post by:
Introduction Cloud-native applications are conventionally identified as those designed and nurtured on cloud infrastructure. Such applications, rooted in cloud technologies, skillfully benefit from...
0
by: abbasky | last post by:
### Vandf component communication method one: data sharing ​ Vandf components can achieve data exchange through data sharing, state sharing, events, and other methods. Vandf's data exchange method...
2
isladogs
by: isladogs | last post by:
The next Access Europe meeting will be on Wednesday 7 Feb 2024 starting at 18:00 UK time (6PM UTC) and finishing at about 19:30 (7.30PM). In this month's session, the creator of the excellent VBE...
0
by: stefan129 | last post by:
Hey forum members, I'm exploring options for SSL certificates for multiple domains. Has anyone had experience with multi-domain SSL certificates? Any recommendations on reliable providers or specific...
0
Git
by: egorbl4 | last post by:
Скачал я git, хотел начать настройку, а там вылезло вот это Что это? Что мне с этим делать? ...
1
by: davi5007 | last post by:
Hi, Basically, I am trying to automate a field named TraceabilityNo into a web page from an access form. I've got the serial held in the variable strSearchString. How can I get this into the...
0
by: MeoLessi9 | last post by:
I have VirtualBox installed on Windows 11 and now I would like to install Kali on a virtual machine. However, on the official website, I see two options: "Installer images" and "Virtual machines"....
0
isladogs
by: isladogs | last post by:
The next Access Europe meeting will be on Wednesday 6 Mar 2024 starting at 18:00 UK time (6PM UTC) and finishing at about 19:15 (7.15PM). In this month's session, we are pleased to welcome back...

By using Bytes.com and it's services, you agree to our Privacy Policy and Terms of Use.

To disable or enable advertisements and analytics tracking please visit the manage ads & tracking page.