類別宣告等同於樣板/設計圖,你可以依據它建立任意數量的類別執行個體。
執行個體成員:類別的每一個執行個體都是獨立個體,各自擁有專屬的資料成員,不會和同類別其他執行個體互相干擾。這類成員稱為執行個體成員,因為它們繫結於類別的執行個體物件。
靜態成員:執行個體成員是預設類型;你也可以宣告靜態成員,靜態成員隸屬於類別本身,而非執行個體物件,後續章節會詳細說明。
下面透過範例進行說明
class Program
{
static void Main(string[] args)
{
Factory factoryFox = new Factory();
Robot robot1 = new Robot();
Robot robot2 = new Robot();
Robot robot3 = new Robot();
}
}
class Factory
{
}
class Robot
{
public string name;
public void SayHello()
{
Console.WriteLine($"Hello everyone my name is {name},I come from Foxdevelop.com");
}
}Code language: JavaScript (javascript)
這個範例當中有兩個類別:Factory 與 Robot。Robot 內包含一個方法與欄位 name,Factory 則沒有 name 欄位。
主函式建立了一個 Factory 執行個體與三個 Robot 執行個體。
接著我們觀察記憶體的儲存結構。

三台機器人 robot1、robot2、robot3,各自擁有獨立的 name,儲存位址互不相同、彼此不受影響。修改 robot1 的內容,不會改變 robot2。
static void Main(string[] args)
{
Factory factoryFox = new Factory();
Robot robot1 = new Robot();
Robot robot2 = new Robot();
Robot robot3 = new Robot();
robot1.name = "Tom"; //三組name各自獨立,互不影響
robot2.name = "Jack";
robot3.name = "Smith";
}Code language: JavaScript (javascript)
函式成員只存在單一份副本
前面提到的 name,每個執行個體都持有獨立版本,互不干涉;修改某個執行個體的 name,不會影響其他執行個體。除了欄位之外,類別內還有另一種成員:函式成員。
類別內的函式成員,是否只有單一份,由所有執行個體共用?
函式(方法)程式本體:全域僅存在一份,全部執行個體共用
類別編譯完成後,方法的機器指令存放於方法表(Method Table),隸屬於型別本身。堆積上所有同類別執行個體都共用這份程式碼,不會為每個物件複製一套函式。
舉 Robot 類別內的 SayHello 為例
class Robot
{
public string name;
public void SayHello()
{
Console.WriteLine($"Hello everyone my name is {name},I come from Foxdevelop.com");
}
}Code language: PHP (php)
記憶體空間除了堆積與堆疊之外,還有其他區段;方法程式碼就儲存在Method Table(方法表)。
類別中的函式存放於方法表。呼叫函式時,系統就執行方法表內對應的程式,因此函式是所有執行個體共享。
static void Main(string[] args)
{
Factory factoryFox = new Factory();
Robot robot1 = new Robot();
Robot robot2 = new Robot();
Robot robot3 = new Robot();
robot1.name = "Tom";
robot2.name = "Jack";
robot3.name = "Smith";
robot1.SayHello();
robot2.SayHello();
robot3.SayHello();
}Code language: JavaScript (javascript)
以上程式當中,三次呼叫 SayHello 執行的是同一支函式。但函式內區域變數各自獨立,存取欄位成員的結果也會隨呼叫的執行個體而不同。
public void SayHello()
{
Console.WriteLine($"Hello everyone my name is {name},I come from Foxdevelop.com");
}Code language: JavaScript (javascript)
robot1 呼叫 SayHello 時,name 就是 Tom;robot2 呼叫 SayHello 時,name 則是 Jack……
執行個體成員