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