C# 的類定義,構造函數和析構函數(學習心得 18)

類,相當於一個數據類型的藍圖。

一、類的定義

關鍵字 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
    }
}

參數:

  • 訪問標識符 指定了對類及其成員的訪問規則。類的默認訪問標識符爲 internal:同一個程序集的對象可以訪問;成員的默認爲 private:對象本身在對象內部可以訪問。
  • 數據類型 指定了變量的類型。
  • 返回類型 指定了返回的方法返回的數據類型。
  • 運用 “點” 運算符訪問成員。

例:

using System;
namespace BoxApplication
{
    class Box
    {
       public double length;   // 長度
       public double breadth;  // 寬度
       public double height;   // 高度
    }
    class Boxtester
    {
        static void Main(string[] args)
        {
            Box Box1 = new Box();        // 聲明 Box1,類型爲 Box
            Box Box2 = new Box();        // 聲明 Box2,類型爲 Box
            double volume = 0.0;         // 體積

            // Box1 詳述
            Box1.height = 5.0;
            Box1.length = 6.0;
            Box1.breadth = 7.0;

            // Box2 詳述
            Box2.height = 10.0;
            Box2.length = 12.0;
            Box2.breadth = 13.0;
           
            // Box1 的體積
            volume = Box1.height * Box1.length * Box1.breadth;
            Console.WriteLine("Box1 的體積: {0}",  volume);

            // Box2 的體積
            volume = Box2.height * Box2.length * Box2.breadth;
            Console.WriteLine("Box2 的體積: {0}", volume);
            Console.ReadKey();
        }
    }
}

運行結果:

Box1 的體積: 210
Box2 的體積: 1560

二、成員函數和封裝

類的成員可以訪問該類所有成員。

所以有 private 的變量,只要通過該類的 public 的方法,也是可以訪問的。

例:

using System;
namespace BoxApplication
{
    class Box
    {
       private double length;   // 長度
       private double breadth;  // 寬度
       private double height;   // 高度
       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();        // 聲明 Box1,類型爲 Box
            Box Box2 = new Box();                // 聲明 Box2,類型爲 Box
            double volume;                               // 體積


            // Box1 詳述
            Box1.setLength(6.0);
            Box1.setBreadth(7.0);
            Box1.setHeight(5.0);

            // Box2 詳述
            Box2.setLength(12.0);
            Box2.setBreadth(13.0);
            Box2.setHeight(10.0);
       
            // Box1 的體積
            volume = Box1.getVolume();
            Console.WriteLine("Box1 的體積: {0}" ,volume);

            // Box2 的體積
            volume = Box2.getVolume();
            Console.WriteLine("Box2 的體積: {0}", volume);
           
            Console.ReadKey();
        }
    }
}

運行結果:

Box1 的體積: 210
Box2 的體積: 1560

三、C# 中的構造函數

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

構造函數的名稱與類的名稱完全相同,它沒有任何返回類型。

例:設定一個構造函數

using System;
namespace LineApplication
{
   class Line
   {
      private double length;   // 線條的長度
      
      // 這裏手動設定一個構造函數,函數名與類名相同,實例化的時候自動調用
      public Line()
      {
         Console.WriteLine("對象已創建");
      }

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

      static void Main(string[] args)
      {
         Line line = new Line();    
         // 設置線條長度
         line.setLength(6.0);
         Console.WriteLine("線條的長度: {0}", line.getLength());
         Console.ReadKey();
      }
   }
}

運行結果:

對象已創建
線條的長度: 6

默認的構造函數沒有任何參數。

但是如果需要一個帶有參數的構造函數可以有參數,這種構造函數叫做參數化構造函數

這種技術可以在創建對象的同時給對象賦初始值。

例:參數化構造函數

using System;
namespace LineApplication
{
   class Line
   {
      private double length;   // 線條的長度
      public Line(double len)  // 參數化構造函數
      {
         Console.WriteLine("對象已創建,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("線條的長度: {0}", line.getLength());
         // 設置線條長度
         line.setLength(6.0);
         Console.WriteLine("線條的長度: {0}", line.getLength());
         Console.ReadKey();
      }
   }
}

運行結果:

對象已創建,length = 10
線條的長度: 10
線條的長度: 6

四、C# 中的析構函數

類的 析構函數 的名稱是在類的名稱前加上一個波浪形(~)作爲前綴,它不返回值,也不帶任何參數。

析構函數用於在結束程序(比如關閉文件、釋放內存等)之前釋放資源。

析構函數不能繼承或重載。

例:

using System;
namespace LineApplication
{
   class Line
   {
      private double length;   // 線條的長度
      public Line()  // 構造函數
      {
         Console.WriteLine("對象已創建");
      }
      ~Line() //析構函數
      {
         Console.WriteLine("對象已刪除");
      }

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

      static void Main(string[] args)
      {
         Line line = new Line();
         // 設置線條長度
         line.setLength(6.0);
         Console.WriteLine("線條的長度: {0}", line.getLength());          
      }
   }
}

運行結果:

對象已創建
線條的長度: 6

這裏我們會發現,在 idle 中不會顯示“對象已刪除”,這是因爲程序員無法控制解構器何時被執行,這是由垃圾蒐集器決定的。程序退出時雖然解構器被調用了,但由於程序已經退出,所以也無法在終端進行顯示。

五、C# 類的靜態成員

使用 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("s1 的變量 num: {0}", s1.getNum());
            Console.WriteLine("s2 的變量 num: {0}", s2.getNum());
            Console.ReadKey();
        }
    }
}

運行結果:

s1 的變量 num: 6
s2 的變量 num: 6

可以把一個成員函數聲明爲 static

靜態函數 只能訪問 靜態變量。

靜態函數 在對象被創建之前就已經存在。

例:

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("變量 num: {0}", StaticVar.getNum()); // 不需要實例化,直接通過類名訪問該靜態函數
            Console.ReadKey();
        }
    }
}

運行結果:

變量 num: 3
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章