C#基礎_15_類
C# 類(Class)
當你定義一個類時,你定義了一個數據型別的藍圖。這實際上並沒有定義任何的資料,但它定義了類的名稱意味著什麼,也就是說,類的物件由什麼組成及在這個物件上可執行什麼操作。物件是類的例項。構成類的方法和變數稱為類的成員。
類的定義
類的定義是以關鍵字 class 開始,後跟類的名稱。類的主體,包含在一對花括號內。下面是類定義的一般形式:
1 <access specifier> class class_name 2 { 3 // member variables 4 <access specifier> <data type> variable1;5 <access specifier> <data type> variable2; 6 ... 7 <access specifier> <data type> variableN; 8 // member methods 9 <access specifier> <return type> method1(parameter_list) 10 { 11 // method body 12 } 13 <access specifier> <returntype> method2(parameter_list) 14 { 15 // method body 16 } 17 ... 18 <access specifier> <return type> methodN(parameter_list) 19 { 20 // method body 21 } 22 }
請注意:
- 訪問識別符號 <access specifier> 指定了對類及其成員的訪問規則。如果沒有指定,則使用預設的訪問識別符號。類的預設訪問識別符號是 internal
- 資料型別 <data type> 指定了變數的型別,返回型別 <return type> 指定了返回的方法返回的資料型別。
- 如果要訪問類的成員,你要使用點(.)運算子。
- 點運算子連結了物件的名稱和成員的名稱。
下面的例項說明了目前為止所討論的概念:
1 using System; 2 namespace BoxApplication 3 { 4 class Box 5 { 6 public double length; // 長度 7 public double breadth; // 寬度 8 public double height; // 高度 9 } 10 class Boxtester 11 { 12 static void Main(string[] args) 13 { 14 Box Box1 = new Box(); // 宣告 Box1,型別為 Box 15 Box Box2 = new Box(); // 宣告 Box2,型別為 Box 16 double volume = 0.0; // 體積 17 18 // Box1 詳述 19 Box1.height = 5.0; 20 Box1.length = 6.0; 21 Box1.breadth = 7.0; 22 23 // Box2 詳述 24 Box2.height = 10.0; 25 Box2.length = 12.0; 26 Box2.breadth = 13.0; 27 28 // Box1 的體積 29 volume = Box1.height * Box1.length * Box1.breadth; 30 Console.WriteLine("Box1 的體積: {0}", volume); 31 32 // Box2 的體積 33 volume = Box2.height * Box2.length * Box2.breadth; 34 Console.WriteLine("Box2 的體積: {0}", volume); 35 Console.ReadKey(); 36 } 37 } 38 }
產生下列結果:
1 Box1 的體積: 210 2 Box2 的體積: 1560
成員函式和封裝
類的成員函式是一個在類定義中有它的定義或原型的函式,就像其他變數一樣。作為類的一個成員,它能在類的任何物件上操作,且能訪問該物件的類的所有成員。
成員變數是物件的屬性(從設計角度),且它們保持私有來實現封裝。這些變數只能使用公共成員函式來訪問。
讓我們使用上面的概念來設定和獲取一個類中不同的類成員的值:
1 using System; 2 namespace BoxApplication 3 { 4 class Box 5 { 6 private double length; // 長度 7 private double breadth; // 寬度 8 private double height; // 高度 9 public void setLength( double len ) 10 { 11 length = len; 12 } 13 14 public void setBreadth( double bre ) 15 { 16 breadth = bre; 17 } 18 19 public void setHeight( double hei ) 20 { 21 height = hei; 22 } 23 public double getVolume() 24 { 25 return length * breadth * height; 26 } 27 } 28 class Boxtester 29 { 30 static void Main(string[] args) 31 { 32 Box Box1 = new Box(); // 宣告 Box1,型別為 Box 33 Box Box2 = new Box(); // 宣告 Box2,型別為 Box 34 double volume; // 體積 35 36 37 // Box1 詳述 38 Box1.setLength(6.0); 39 Box1.setBreadth(7.0); 40 Box1.setHeight(5.0); 41 42 // Box2 詳述 43 Box2.setLength(12.0); 44 Box2.setBreadth(13.0); 45 Box2.setHeight(10.0); 46 47 // Box1 的體積 48 volume = Box1.getVolume(); 49 Console.WriteLine("Box1 的體積: {0}" ,volume); 50 51 // Box2 的體積 52 volume = Box2.getVolume(); 53 Console.WriteLine("Box2 的體積: {0}", volume); 54 55 Console.ReadKey(); 56 } 57 } 58 }
產生下列結果:
1 Box1 的體積: 210 2 Box2 的體積: 1560
C# 中的建構函式
類的 建構函式 是類的一個特殊的成員函式,當建立類的新物件時執行。
建構函式的名稱與類的名稱完全相同,它沒有任何返回型別。
下面的例項說明了建構函式的概念:
1 using System; 2 namespace LineApplication 3 { 4 class Line 5 { 6 private double length; // 線條的長度 7 public Line() 8 { 9 Console.WriteLine("物件已建立"); 10 } 11 12 public void setLength( double len ) 13 { 14 length = len; 15 } 16 public double getLength() 17 { 18 return length; 19 } 20 21 static void Main(string[] args) 22 { 23 Line line = new Line(); 24 // 設定線條長度 25 line.setLength(6.0); 26 Console.WriteLine("線條的長度: {0}", line.getLength()); 27 Console.ReadKey(); 28 } 29 } 30 }
產生下列結果:
1 物件已建立 2 線條的長度: 6
預設的建構函式沒有任何引數。但是如果你需要一個帶有引數的建構函式可以有引數,這種建構函式叫做引數化建構函式。這種技術可以幫助你在建立物件的同時給物件賦初始值,具體請看下面例項:
1 using System; 2 namespace LineApplication 3 { 4 class Line 5 { 6 private double length; // 線條的長度 7 public Line(double len) // 引數化建構函式 8 { 9 Console.WriteLine("物件已建立,length = {0}", len); 10 length = len; 11 } 12 13 public void setLength( double len ) 14 { 15 length = len; 16 } 17 public double getLength() 18 { 19 return length; 20 } 21 22 static void Main(string[] args) 23 { 24 Line line = new Line(10.0); 25 Console.WriteLine("線條的長度: {0}", line.getLength()); 26 // 設定線條長度 27 line.setLength(6.0); 28 Console.WriteLine("線條的長度: {0}", line.getLength()); 29 Console.ReadKey(); 30 } 31 } 32 }
產生下列結果:
1 物件已建立,length = 10 2 線條的長度: 10 3 線條的長度: 6
C# 中的解構函式
類的 解構函式 是類的一個特殊的成員函式,當類的物件超出範圍時執行。
解構函式的名稱是在類的名稱前加上一個波浪形(~)作為字首,它不返回值,也不帶任何引數。
解構函式用於在結束程式(比如關閉檔案、釋放記憶體等)之前釋放資源。解構函式不能繼承或過載。
下面的例項說明了解構函式的概念:
1 using System; 2 namespace LineApplication 3 { 4 class Line 5 { 6 private double length; // 線條的長度 7 public Line() // 建構函式 8 { 9 Console.WriteLine("物件已建立"); 10 } 11 ~Line() //解構函式 12 { 13 Console.WriteLine("物件已刪除"); 14 } 15 16 public void setLength( double len ) 17 { 18 length = len; 19 } 20 public double getLength() 21 { 22 return length; 23 } 24 25 static void Main(string[] args) 26 { 27 Line line = new Line(); 28 // 設定線條長度 29 line.setLength(6.0); 30 Console.WriteLine("線條的長度: {0}", line.getLength()); 31 } 32 } 33 }
會產生下列結果:
1 物件已建立 2 線條的長度: 6 3 物件已刪除
C# 類的靜態成員
我們可以使用 static 關鍵字把類成員定義為靜態的。當我們宣告一個類成員為靜態時,意味著無論有多少個類的物件被建立,只會有一個該靜態成員的副本。
關鍵字 static 意味著類中只有一個該成員的例項。靜態變數用於定義常量,因為它們的值可以通過直接呼叫類而不需要建立類的例項來獲取。靜態變數可在成員函式或類的定義外部進行初始化。你也可以在類的定義內部初始化靜態變數。
下面的例項演示了靜態變數的用法: