共用方式為


類別 (Visual C# Express)

更新:2007 年 11 月

C# 是物件導向的程式設計語言,與其他較新的開發語言一樣,C# 會將相關欄位、方法、屬性和事件分組成名為類別的資料結構。

類別和物件的比較

類別基本上是自訂資料型別的藍圖。一旦定義了類別,您就可以將它載入到記憶體中使用。載入到記憶體中的類別稱為「物件」或「執行個體」。您可以使用 C# 關鍵字 new 建立類別的執行個體。

以下範例示範定義名為 SampleClass 的類別,以及建立名為 sampleClass1 的物件,此物件為該類別的執行個體。因為 C# 要求 Main 函式必須在類別中定義,所以下列程式碼也會定義 Program 類別,但該類別不用來建立物件。

using System;

class SampleClass
{
    public void SayHello()
    {
        Console.WriteLine("Hello, World!");
    }
}

class Program
{
    //Main is the entrypoint, where every C# program starts
    static void Main(string[] args)
    {
        SampleClass sampleClass1 = new SampleClass();  // Create an object
        sampleClass1.SayHello();                       // Call a method
    }
}

如同您可以用相同的藍圖建立任意數量的房子,您也可以用相同的類別執行個體化任意數量的物件。陣列或清單包含多個相同類別的物件是很常見的事。類別的每個執行個體都會佔據各自所屬的記憶體空間,且其欄位的值 (除了下述的靜態欄位之外) 也是各自獨立。在下述的程式碼範例中,您可建立一個 Animal 型別的物件,並將其大小設為 2,還會建立另一個物件,其大小設為 3。但是,這個規則有一個很重要的例外狀況,就是「靜態成員」。

靜態和執行個體成員的比較

靜態成員是不需要參考類別的特定執行個體就可以存取的方法或欄位。最常見的靜態方法是 Main,它是所有 C# 程式的進入點 (Entry Point)。請注意,您並不需要建立包含類別的執行個體,就可以呼叫 Main 方法。另一個常用的靜態方法是 Console 類別的 WriteLine。在存取靜態方法時,請注意語法上的差異。在點運算式:Console.WriteLine 左邊應使用類別名稱,而不是執行個體名稱。

將類別欄位宣告為靜態時,該類別的所有執行個體都會「共用」該欄位。如果下列程式碼中的 size 宣告為靜態,且有一個 Animal 物件變更了該值,則 Animal 型別之所有物件的此值都會變更。

靜態類別的所有成員都是靜態。靜態類別、方法和欄位在某些案例中因為效能和效率的原因會很有幫助。但是,如果您把某個欄位當成是執行個體欄位,但實際上它是靜態欄位時,就會發生小錯誤。如需詳細資訊,請參閱靜態類別和靜態類別成員 (C# 程式設計手冊)

類別和檔案的比較

每個 C# 程式至少有一個類別。設計程式時,良好的程式設計作法是在每個原始程式碼 (.cs) 檔內保留單一類別,但不一定要這麼做。如果您使用 C# 整合式開發環境 (IDE) 建立類別,就會同時自動建立新的原始程式碼檔。

封裝

類別通常表示某個東西的特性以及它可執行的動作。例如,若要將某個動物表示為 C# 類別,您必須以數字和某些函式,例如 MoveLeft()、MoveRight()、SpeedUp()、Stop() 等等來表示其大小、速度和長處,在這些函式中您可撰寫程式碼,讓這些「動物」執行那些動作。在 C# 中,您的動物類別看起來會像這樣:

    public class Animal
    {
        private int size;
        private float speed;
        private int strength;

        public void MoveLeft()  // method
        {
            // code goes here...
        }

        // other methods go here...
    }

如果您瀏覽 .NET Framework Class Library,就會看到每個類別都代表某個「東西」,例如 XmlDocumentStringForm,每個東西都有它可執行的不同動作 (方法)、您可讀取或是修改的特性 (屬性),以及在執行某些特定動作時,它會傳出的告知 (事件)。這些方法、屬性和事件,以及所有其他內部變數和常數 (欄位),都稱為類別的成員。

將成員群組成類別不僅是符合邏輯的,還可以讓您隱藏不想讓其他程式碼存取的資料和函式。這個原則稱為「封裝」(Encapsulation)。當您瀏覽 .NET Framework 類別庫時,您只會看到這些類別的公用成員。每個類別也可能有私用成員,這些私用成員由該類別或與其相關的類別在內部使用,但不可供應用程式使用。在建立自己的類別時,您可決定哪些成員應為公用,哪些應為私用。

繼承

類別可繼承另一個類別,也就是說它包含了原始類別的所有公用和私用成員,再加上它所定義的其他成員。這個原始類別稱為「基底類別」,而新的類別稱為「衍生類別」。您可以建立衍生類別表示更特殊化的基底類別類型。例如,您可定義繼承自 Animal 的 Cat 類別。Cat 可執行任何 Animal 可執行的動作,此外它還可以執行某個額外的唯一動作。C# 程式碼看起來如下所示:

    public class Cat : Animal
    {
        public void Purr()
        {
        }
    }

Cat : Animal 標記法表示 Cat 是繼承自 Animal,因此 Cat 也有 MoveLeft 方法和三個私用變數 size、speed 和 strength。如果您定義了繼承自 Cat 的 SiameseCat 類別,它就會具有 Cat 的所有成員,以及 Animal 的所有成員。

多型

在電腦程式設計的領域中,「多型」(Polymorphism) 是指衍生類別重新定義或「覆寫」從基底類別繼承而來之方法的能力。當您需要在方法中執行某個特定的動作,而該動作不是有所不同,就是尚未在基底類別中定義時,您就可以使用這個功能。例如,Animal.MoveLeft 方法,因為它必須非常廣泛才能對所有的動物都有效,所以它可能非常簡單:像是「變更方位讓動物的頭部指向 X 的方向」。但是,在您的 Cat 類別中,這樣可能還不夠。您可能需要指定 Cat 在轉身時要如何移動牠的爪子和尾巴。如果你也定義了 Fish 類別或 Bird 類別,就可能也需要以不同的方式為每個類別覆寫 MoveLeft 方法。因為您可以自訂特定類別之 MoveLeft 方法的行為,所以建立類別和呼叫其方法的程式碼就不會對世界上的每種動物各有不同的方法。只要物件是繼承自 Amimal,呼叫的程式碼就只能呼叫 MoveLeft 方法,且會叫用物件本身的方法版本。

建構函式

每個類別都有建構函式:就是擁有與類別相同名稱的方法。根據類別定義建立物件時,就會呼叫建構函式。建構函式通常會設定於類別中定義之變數的初始值。如果數值資料型別的初始值要設為零、布林資料型別的初始值要設為 false,或參考型別的初始值要設為 null,則建構函式就不一定會設定初始值,因為這些資料型別都會自動進行初始化。

您可定義具有任何數量之參數的建構函式。不具有任何參數的建構函式稱為「預設建構函式」。下列範例定義了具有預設建構函式的類別,以及帶有字串之建構函式的類別,然後使用這些類別:

class SampleClass
{
    string greeting;

    public SampleClass()
    {
        greeting = "Hello, World";
    }

    public SampleClass(string message)
    {
        greeting = message;
    }

    public void SayHello()
    {
        System.Console.WriteLine(greeting);
    }
}

class Program
{
    static void Main(string[] args)
    {
        // Use default constructor.
        SampleClass sampleClass1 = new SampleClass();
        sampleClass1.SayHello();

        // Use constructor that takes a string parameter.
        SampleClass sampleClass2 = new SampleClass("Hello, Mars");
        sampleClass2.SayHello();
    }
}

運算子多載

在上述範例 SampleClass() 中,以相同名稱建立不同的方法稱為多載。編譯器知道要使用哪個方法,因為每次建立物件時都會提供引數清單 (如果有的話)。多載可以讓程式碼更有彈性並容易閱讀。

解構函式

如果使用過 C++,您可能也知道解構函式。因為 C# 中的自動記憶體回收系統,所以除非您的類別使用了 Unmanaged 資源,否則您不太可能需要實作解構函式。如需詳細資訊,請參閱解構函式 (C# 程式設計手冊)

結構

結構 (Struct) 是一種型別,除了不支援繼承之外,在很多方面都和類別相似。如需詳細資訊,請參閱結構 (Visual C# Express)

請參閱

工作

HOW TO:呼叫物件的方法 (Visual C#)

HOW TO:繼承自類別 (Visual C#)

概念

C# 語言入門

參考

類別和結構 (C# 程式設計手冊)

類別 (C# 參考)

struct (C# 參考)