C# 類(Class)
當您定義一個類時,您定義了一個數據類型的藍圖。 這實際上並沒有定義任何的數據,但它定義了類的名稱意味著什麼,也就是說,類的對象由什麼組成及在這個對像上可執行什麼操作。 對像是類的實例。 構成類的方法和變量成為類的成員。
類的定義
類的定義是以關鍵字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 } }
請注意:
- 訪問標識符<access specifier> 指定了對類及其成員的訪問規則。 如果沒有指定,則使用默認的訪問標識符。 類的默認訪問標識符是internal ,成員的默認訪問標識符是private 。
- 數據類型<data type> 指定了變量的類型,返回類型<return type> 指定了返回的方法返回的數據類型。
- 如果要訪問類的成員,您要使用點(.)運算符。
- 點運算符鏈接了對象的名稱和成員的名稱。
下面的實例說明了目前為止所討論的概念:
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
成員函數和封裝
類的成員函數是一個在類定義中有它的定義或原型的函數,就像其他變量一樣。 作為類的一個成員,它能在類的任何對像上操作,且能訪問該對象的類的所有成員。
成員變量是對象的屬性(從設計角度),且它們保持私有來實現封裝。 這些變量只能使用公共成員函數來訪問。
讓我們使用上面的概念來設置和獲取一個類中不同的類成員的值:
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 對像已刪除
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("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