CSharp – Classes – Constructors – Destructors – Static

Classes are an expanded concept of data structures (struct): like data structures, they can contain data members, but they can also contain functions as members.

Class Definition

Syntax:


<access specifier> class  class_name 
{
    // member variables
    <access specifier> <data type> variable1;
    <access specifier> <data type> variable2;
    ...
    <access specifier> <data type> variableN;
    // member methods
    <access specifier> <return type> method1(parameter_list) 
    {
        // method body 
    }
    <access specifier> <return type> method2(parameter_list) 
    {
        // method body 
    }
    ...
    <access specifier> <return type> methodN(parameter_list) 
    {
        // method body 
    }
}

Using variables from a class


using System;
namespace BoxApplication
{
    class Box
    {
       public double length;   // Length of a box
       public double breadth;  // Breadth of a box
       public double height;   // Height of a box
    }
    class Boxtester
    {
        static void Main(string[] args)
        {
            Box Box1 = new Box();        // Declare Box1 of type Box
            Box Box2 = new Box();        // Declare Box2 of type Box
            double volume = 0.0;         // Store the volume of a box here

            // box 1 specification
            Box1.height = 5.0;
            Box1.length = 6.0;
            Box1.breadth = 7.0;

            // box 2 specification
            Box2.height = 10.0;
            Box2.length = 12.0;
            Box2.breadth = 13.0;
           
            // volume of box 1
            volume = Box1.height * Box1.length * Box1.breadth;
            Console.WriteLine("Volume of Box1 : {0}",  volume);

            // volume of box 2
            volume = Box2.height * Box2.length * Box2.breadth;
            Console.WriteLine("Volume of Box2 : {0}", volume);
            Console.ReadKey();
        }
    }
}

Notice:


Box Box1 = new Box(); 
...
Box1.height = 5.0;

The result is:

Volume of Box1 : 210
Volume of Box2 : 1560

For italian peolple: come funziona?
1. carico il namespace (raccolta di classi e funzioni) -> using System
2. incapsulo tutto il codice in un namespace con il nome del mio file c# -> namespace BoxApplication
3. creo la classe Box e dichiaro le variabili della classe Box -> length, breadth, height.
4. creo la classe Boxtester, con all’interno la funzione Main(), che è la prima che viene eseguita da c#
5. quando viene eseguita Main()dichiaro che Box1 è una variabile della classe Box -> Box Box1 = new Box()
6. quindi può essere associata alle variabili della classe Box -> Box1.height = 5.0; – Box1.length = 6.0; – Box1.breadth = 7.0;
7. eseguo le operazioni per il valcolo del volume

Using functions from a class


using System;
namespace LineApplication
{
   class Line
   {
      private double length;   // Length of a line
      public Line()
      {
         Console.WriteLine("Object is being created");
      }

      public void setLength( double len )
      {
         length = len;
      }
      public double getLength()
      {
         return length;
      }

      static void Main(string[] args)
      {
         Line line = new Line(); // Declare line of type Line   
         // set line length
         line.setLength(6.0);
         Console.WriteLine("Length of line : {0}", line.getLength());
         Console.ReadKey();
      }
   }
}

Notice:


Line line = new Line(); 
...
line.setLength(6.0);

The result is:

Object is being created
Length of line : 6

Constructors and Destructors

A destructor is a special member function of a class that is executed whenever an object of its class goes out of scope. A destructor will have exact same name as the class prefixed with a tilde (~) and it can neither return a value nor can it take any parameters.

Destructor can be very useful for releasing resources before coming out of the program like closing files, releasing memories etc. Destructors cannot be inherited or overloaded.


using System;
namespace LineApplication
{
   class Line
   {
      private double length;   // Length of a line
      public Line()  // constructor
      {
         Console.WriteLine("Object is being created");
      }
      ~Line() //destructor
      {
         Console.WriteLine("Object is being deleted");
      }

      public void setLength( double len )
      {
         length = len;
      }
      public double getLength()
      {
         return length;
      }

      static void Main(string[] args)
      {
         Line line = new Line();
         // set line length
         line.setLength(6.0);
         Console.WriteLine("Length of line : {0}", line.getLength());           
      }
   }
}

The result is:

Object is being created
Length of line : 6
Object is being deleted

For italian people: come funziona?
Quando a funzione Line() ha esaurito la sua utilità, ~Line() la distrugge (Destructor) per liberare risorse hardware.

Static

We can define class members as static using the static keyword. When we declare a member of a class as static, it means no matter how many objects of the class are created, there is only one copy of the static member.


using System;
namespace StaticVarApplication
{
    class StaticVar
    {
        public static int num; // notice static keyword
        public void count()
        {
            num++;
        }
        public int getNum()
        {
            return num;
        }
    }
    class StaticTester
    {
        static void Main(string[] args)
        {
            StaticVar s1 = new StaticVar();
            StaticVar s2 = new StaticVar();
            s1.count();
            s1.count();
            s1.count();
            s2.count();
            s2.count();
            s2.count();         
            Console.WriteLine("Variable num for s1: {0}", s1.getNum());
            Console.WriteLine("Variable num for s2: {0}", s2.getNum());
            Console.ReadKey();
        }
    }
}

The result is:

Variable num for s1: 6
Variable num for s2: 6

If you remove static:


using System;
namespace StaticVarApplication
{
    class StaticVar
    {
        public int num; // notice static keyword
        public void count()
        {
            num++;
        }
        public int getNum()
        {
            return num;
        }
    }
    class StaticTester
    {
        static void Main(string[] args)
        {
            StaticVar s1 = new StaticVar();
            StaticVar s2 = new StaticVar();
            s1.count();
            s1.count();
            s1.count();
            s2.count();
            s2.count();
            s2.count();         
            Console.WriteLine("Variable num for s1: {0}", s1.getNum());
            Console.WriteLine("Variable num for s2: {0}", s2.getNum());
            Console.ReadKey();
        }
    }
}

The result is:

Variable num for s1: 3
Variable num for s2: 3