Mega Code Archive

 
Categories / C# / Class Interface
 

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

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