Shows that stack unwinding in C# does not necessarily call destructors

image_pdfimage_print

   

/*
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 ());
        }
    }
}