473,378 Members | 1,454 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,378 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 2329
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...
1
by: CloudSolutions | last post by:
Introduction: For many beginners and individual users, requiring a credit card and email registration may pose a barrier when starting to use cloud servers. However, some cloud server providers now...
0
by: Faith0G | last post by:
I am starting a new it consulting business and it's been a while since I setup a new website. Is wordpress still the best web based software for hosting a 5 page website? The webpages will be...
0
by: ryjfgjl | last post by:
In our work, we often need to import Excel data into databases (such as MySQL, SQL Server, Oracle) for data analysis and processing. Usually, we use database tools like Navicat or the Excel import...
0
by: taylorcarr | last post by:
A Canon printer is a smart device known for being advanced, efficient, and reliable. It is designed for home, office, and hybrid workspace use and can also be used for a variety of purposes. However,...
0
by: Charles Arthur | last post by:
How do i turn on java script on a villaon, callus and itel keypad mobile phone
0
by: aa123db | last post by:
Variable and constants Use var or let for variables and const fror constants. Var foo ='bar'; Let foo ='bar';const baz ='bar'; Functions function $name$ ($parameters$) { } ...
0
by: ryjfgjl | last post by:
If we have dozens or hundreds of excel to import into the database, if we use the excel import function provided by database editors such as navicat, it will be extremely tedious and time-consuming...
0
by: emmanuelkatto | last post by:
Hi All, I am Emmanuel katto from Uganda. I want to ask what challenges you've faced while migrating a website to cloud. Please let me know. Thanks! Emmanuel
0
BarryA
by: BarryA | last post by:
What are the essential steps and strategies outlined in the Data Structures and Algorithms (DSA) roadmap for aspiring data scientists? How can individuals effectively utilize this roadmap to progress...

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.