位置:首頁 > 高級語言 > C#教學 > C#類

C#類

當你定義一個類時,也就是定義一個藍圖的數據類型。這實際上並不定義任何數據,但它確實定義類的名字是什麼意思,即,什麼類的對象將包括哪些操作可以對這樣的對象來執行。對象是一個類的實例。構成一類的方法和變量被稱為類的成員。

類定義

類定義以關鍵字class後跟類名稱;和類體,封閉由一對大括號中。以下是一個類定義的一般形式:

<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 
    }
}

請注意,

  • 訪問符指定訪問規則的成員以及類本身,如果冇有提到一個類訪問類型,那麼默認訪問說明符是內部的。為成員默認訪問是私有(private)。

  • 數據類型指定變量的類型,並返回類型指定數據,由該方法返回,如果有任何數據類型。

  • 要訪問類的成員,可使用點(.)運算符。

  • 點運算符鏈接的對象與成員的名稱。

下麵的例子說明,到目前為止討論的概念:

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

讓我們編譯和運行上麵的程序,這將產生以下結果:

Volume of Box1 : 210
Volume of Box2 : 1560

成員函數和封裝

一個類的成員函數是一個函數,有它的定義或像任何其他變量的類定義中的原型。其所操作的類,其中它是一個成員的任何對象,並且有權訪問一個類用於該對象的所有成員。

成員變量是一個對象(從設計的角度來看)的屬性,並執行封裝它們為私有。這些變量隻能使用公共成員函數訪問。

讓我們把上述概念來設置和獲取一類不同的類成員的值:

using System;
namespace BoxApplication
{
    class Box
    {
       private double length;   // Length of a box
       private double breadth;  // Breadth of a box
       private double height;   // Height of a box
       public void setLength( double len )
       {
            length = len;
       }

       public void setBreadth( double bre )
       {
            breadth = bre;
       }

       public void setHeight( double hei )
       {
            height = hei;
       }
       public double getVolume()
       {
           return length * breadth * height;
       }
    }
    class Boxtester
    {
        static void Main(string[] args)
        {
            Box Box1 = new Box();        // Declare Box1 of type Box
            Box Box2 = new Box();
            double volume;


            // Declare Box2 of type Box
            // box 1 specification
            Box1.setLength(6.0);
            Box1.setBreadth(7.0);
            Box1.setHeight(5.0);

            // box 2 specification
            Box2.setLength(12.0);
            Box2.setBreadth(13.0);
            Box2.setHeight(10.0);
       
            // volume of box 1
            volume = Box1.getVolume();
            Console.WriteLine("Volume of Box1 : {0}" ,volume);

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

讓我們編譯和運行上麵的程序,這將產生以下結果:

Volume of Box1 : 210
Volume of Box2 : 1560

C#中類的構造函數

類的構造函數是,每當我們創建該類的新對象時執行一類特殊的成員函數。

構造函數都會有完全相同的名字作為類,它冇有任何的返回類型。下麵的示例說明構造函數的概念:

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();    
         // set line length
         line.setLength(6.0);
         Console.WriteLine("Length of line : {0}", line.getLength());
         Console.ReadKey();
      }
   }
}

讓我們編譯和運行上麵的程序,這將產生以下結果:

Object is being created
Length of line : 6

默認的構造函數可以不用任何參數,但如果需要一個構造函數有參數。這樣的構造函數調用參數的構造函數。這種技術幫助你在其創建時的初始值分配給一個對象作為顯示在下麵的例子:

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

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

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

讓我們編譯和運行上麵的程序,這將產生以下結果:

Object is being created, length = 10
Length of line : 10
Length of line : 6

在C#中的析構函數

析構函數是執行每當它的類的對象超出範圍的一類特殊的成員函數。析構函數將有完全相同的名稱作為前綴類使用波浪號(〜),它可以冇有返回值,也不能采取任何參數。

析構函數可以為退出程序之前像關閉文件,釋放內存等,析構函數不能被繼承或被重載之前釋放的資源非常有用的。

以下舉例說明析構函數的概念:

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

讓我們編譯和運行上麵的程序,這將產生以下結果:

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

C#類的靜態成員

我們可以使用static關鍵字定義的類成員為靜態。當我們聲明一個類的靜態成員,這意味著無論多少許多類的對象被創建,有靜態成員隻有一個副本。

關鍵字static意味著構建一個實例存在類。靜態變量用於定義常量,因為它們的值可以通過調用類,而無需創建它的一個實例進行檢索。靜態變量可以在成員函數或類定義之外被初始化。也可以初始化類在定義靜態變量的時候。

下麵的例子演示了如何使用靜態變量:

using System;
namespace StaticVarApplication
{
    class StaticVar
    {
       public static int num;
        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();
        }
    }
}

讓我們編譯和運行上麵的程序,這將產生以下結果:

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

也可以聲明一個成員函數為靜態。這些函數隻能訪問靜態變量。在創建對象之前靜態函數是可以存在的。下麵的例子演示了如何使用靜態函數:

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

讓我們編譯和運行上麵的程序,這將產生以下結果:

Variable num: 3