/* Mastering Visual C# .NET by Jason Price, Mike Gunderloy Publisher: Sybex; ISBN: 0782129110 */ /* Example5_14.cs illustrates a destructor */ // declare the Car class class Car { // define the destructor ~Car() { System.Console.WriteLine("In ~Car() destructor"); // do any cleaning up here } } public class Example5_14 { public static void Main() { // create a Car object Car myCar = new Car(); System.Console.WriteLine("At the end of Main()"); } }
Month: February 2011
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 ()); } } }
the destructors are called bottom-up, which confirms the sequencing of destructors.
using System; public class Starter { public static void Main() { XClass obj = new XClass(); } } public class MyClass { ~MyClass() { Console.WriteLine("MyClass destructor"); } } public class YClass : MyClass { ~YClass() { Console.WriteLine("YClass destructor"); } } public class XClass : YClass { ~XClass() { Console.WriteLine("XClass destructor"); } }
force the GC to invoke Finalize() for finalizable objects created in this AppDomain.
using System; using System.Collections.Generic; using System.Text; public class MyResourceWrapper { ~MyResourceWrapper() { Console.Beep(); } } class Program { static void Main(string[] args) { MyResourceWrapper rw = new MyResourceWrapper(); } }
Finalizable Disposable Class
using System;
using System.Collections.Generic;
using System.Text;
class Program {
static void Main(string[] args) {
using (MyResourceWrapper rw = new MyResourceWrapper()) {
}
MyResourceWrapper rw2 = new MyResourceWrapper();
for (int i = 0; i < 10; i++)
rw2.Dispose();
}
}
public class MyResourceWrapper : IDisposable {
public void Dispose() {
Console.WriteLine("In Dispose() method!");
}
}
[/csharp]
C# Class Constructor Overloading
public Overloading { public static void Main() { Point myPoint = new Point(10, 15); Point mySecondPoint = new Point(myPoint); } } class Point { // create a new point from x and y values public Point(int x, int y) { this.x = x; this.y = y; } // create a point from an existing point public Point(Point p) { this.x = p.x; this.y = p.y; } int x; int y; }
Add a constructor to Building
/* C#: The Complete Reference by Herbert Schildt Publisher: Osborne/McGraw-Hill (March 8, 2002) ISBN: 0072134852 */ // Add a constructor to Building. using System; class Building { public int floors; // number of floors public int area; // total square footage of building public int occupants; // number of occupants public Building(int f, int a, int o) { floors = f; area = a; occupants = o; } // Display the area per person. public int areaPerPerson() { return area / occupants; } /* Return the maximum number of occupants if each is to have at least the specified minum area. */ public int maxOccupant(int minArea) { return area / minArea; } } // Use the parameterized Building constructor. public class BuildingDemo21 { public static void Main() { Building house = new Building(2, 2500, 4); Building office = new Building(3, 4200, 25); Console.WriteLine("Maximum occupants for house if each has " + 300 + " square feet: " + house.maxOccupant(300)); Console.WriteLine("Maximum occupants for office if each has " + 300 + " square feet: " + office.maxOccupant(300)); } }