/*
C# Programming Tips & Techniques
by Charles Wright, Kris Jamsa
Publisher: Osborne/McGraw-Hill (December 28, 2001)
ISBN: 0072193794
*/
// Unwind.cs -- Shows that stack unwinding in C# does not necessarily call
// destructors.
// Compile this program with the following command line:
// C:>csc Unwind.cs
//
namespace nsStack
{
using System;
using System.IO;
public class Unwind
{
static public void Main ()
{
Unwind main = new Unwind();
// Set up the try ... catch block
try
{
main.TestStack ();
}
catch (FileNotFoundException e)
{
// Show the contents of the Message string in each class object
if (clsFirst.Message == null)
Console.WriteLine ("First message is null");
else
Console.WriteLine (clsFirst.Message);
if (clsFirst.Message == null)
Console.WriteLine ("Second message is null");
else
Console.WriteLine (clsSecond.Message);
if (clsFirst.Message == null)
Console.WriteLine ("Third message is null");
else
Console.WriteLine (clsThird.Message);
// Show the exception object message
Console.WriteLine (e.Message);
}
}
void TestStack ()
{
// Create a new clsFirst object and call a method in it
clsFirst first = new clsFirst ();
first.FirstFunc();
}
}
class clsFirst
{
~clsFirst ()
{
Message = "clsFirst destructor called";
}
static public string Message = null;
public void FirstFunc()
{
// Create a new clsSecond object and call a method in it
clsSecond second = new clsSecond();
second.SecondFunc ();
}
}
class clsSecond {
~clsSecond () {
Message = "clsSecond destructor called";
}
static public string Message = null;
public void SecondFunc()
{
// Create a new clsThird object and call a method in it
clsThird third = new clsThird();
third.ThirdFunc ();
}
}
class clsThird
{
~clsThird () {
Message = "clsThird destructor called";
}
static public string Message = null;
public void ThirdFunc() {
ThrowException ();
}
// By the time the program gets here, it is five method calls deep.
// Throw an exception to force a stack unwind.
private void ThrowException () {
throw (new FileNotFoundException ());
}
}
}
|