類別 (C# 程式設計手冊)
「類別」(Class) 是一種建構,可讓您建立自己的自訂協別,方法是將其他型別、方法和事件的變數群組在一起。 類別類似藍圖, 它定義型別的資料和行為。 如果類別未宣告為靜態 (Static),用戶端程式碼可透過建立指派給變數的「物件」(Object) 或「執行個體」(Instance) 來使用該類別。 變數會一直保留在記憶體中,直到所有指向它的參考都離開範圍為止。 屆時,CLR 會將其標示為可以進行記憶體回收。 如果類別宣告為靜態,則記憶體中只會有一份複本,而用戶端程式碼只能透過類別本身存取該類別,不能透過「執行個體變數」(Instance Variable) 進行存取。 如需詳細資訊,請參閱靜態類別和靜態類別成員 (C# 程式設計手冊)。
與結構 (Struct) 不同的是,類別支援「繼承」(Inheritance),而繼承是物件導向程式設計的基礎特性。 如需詳細資訊,請參閱繼承 (C# 程式設計手冊)。
宣告類別
類別是使用 class 關鍵字宣告的,如下列範例所示:
public class Customer
{
//Fields, properties, methods and events go here...
}
在 class 關鍵字之前是存取層級。 因為在此範例中使用 public,所以任何人都能從這個類別建立物件。 類別的名稱是跟隨在 class 關鍵字之後。 定義的其餘部分是類別主體,行為和資料就是在其中加以定義的。 類別上的欄位、屬性、方法和事件通稱為「類別成員」(Class Member)。
建立物件
雖然類別和物件有時候會交替地使用,但這兩者並不相同。 類別會定義物件型別,但它不是物件本身。 物件是以類別為基礎的具象實體 (Entity),而且有時候也稱為類別的執行個體 (Instance)。
使用 new 關鍵字,後面加上物件將會以其做為基礎之類別的名稱,即可建立物件,如下所示:
Customer object1 = new Customer();
建立類別的執行個體後,物件的參考便會傳回給程式設計人員。 在上述範例中,object1 是以 Customer 為基礎之物件的參考。 這個參考會指向新的物件,但不會包含物件資料本身。 其實,您完全不用建立物件,就可以建立物件參考:
Customer object2;
我們不建議您建立類似這種不參考物件的物件參考,因為在執行階段嘗試透過這樣的參考存取物件將會失敗。 然而,藉由建立新的物件,或是將參考指派到如下的現有物件,也可以讓這類參考指向物件:
Customer object3 = new Customer();
Customer object4 = object3;
此程式碼會建立參考同一物件的兩個物件參考。 因此,透過 object3 對物件所做的任何變更,將會反映在 object4 的後續使用中。 因為以類別為基礎的物件是以傳址 (By Reference) 方式進行參考,所以類別又稱為參考型別 (Reference Type)。
類別繼承
繼承是使用「衍生」(Derivation) 來完成的,這表示類別是使用繼承資料和行為之來源的「基底類別」(Base Class) 所宣告的。 透過附加逗號和基底類別的名稱,然後再加上衍生的類別名稱,就可指定基底類別,如下所示:
public class Manager : Employee
{
// Employee fields, properties, methods and events are inherited
// New Manager fields, properties, methods and events go here...
}
當類別宣告基底類別時,它會繼承除了建構函式 (Constructor) 以外的所有基底類別成員。
與 C++ 不同的是,C# 中的類別只能從一個基底類別直接繼承。 不過,因為基底類別本身可能是繼承自另一個類別,所以一個類別可能間接繼承許多基底類別。 此外,類別可以直接實作一個以上的介面。 如需詳細資訊,請參閱介面 (C# 程式設計手冊)。
您可以將類別宣告為抽象。 抽象類別 (Abstract Class) 可以包含具有簽章定義但沒有實作 (Implementation) 的抽象方法。 抽象類別不能具現化 (Instantiated), 只能透過實作抽象方法的衍生類別 (Derived Class) 來使用。 相較之下,密封類別不允許其他類別從它衍生。 如需詳細資訊,請參閱抽象和密封類別以及類別成員 (C# 程式設計手冊)。
類別定義可以分割,置於不同的原始程式檔中。 如需詳細資訊,請參閱部分類別和方法 (C# 程式設計手冊)。
描述
在下列範例中,會定義一個公用類別,其中包含單一的欄位、一個方法,以及稱為建構函式 (Constructor) 的特殊方法。 如需詳細資訊,請參閱建構函式 (C# 程式設計手冊)。 接著,會以 new 關鍵字執行個體化類別。
範例
public class Person
{
// Field
public string name;
// Constructor that takes no arguments.
public Person()
{
name = "unknown";
}
// Constructor that takes one argument.
public Person(string nm)
{
name = nm;
}
// Method
public void SetName(string newName)
{
name = newName;
}
}
class TestPerson
{
static void Main()
{
// Call the constructor that has no parameters.
Person person1 = new Person();
Console.WriteLine(person1.name);
person1.SetName("John Smith");
Console.WriteLine(person1.name);
// Call the constructor that has one parameter.
Person person2 = new Person("Sarah Jones");
Console.WriteLine(person2.name);
// Keep the console window open in debug mode.
Console.WriteLine("Press any key to exit.");
Console.ReadKey();
}
}
// Output:
// unknown
// John Smith
// Sarah Jones
C# 語言規格
如需詳細資訊,請參閱<C# 語言規格>。語言規格是 C# 語法及用法的限定來源。