CodeGym /課程 /C# SELF /用 new 運算子創建物件

用 new 運算子創建物件

C# SELF
等級 16 , 課堂 2
開放

1. 正確創建物件的方法

new 運算子在 C# 裡就像一個魔法按鈕,能把一個「藍圖」(我們的 class)變成真正可以操作的實例(物件)。簡單說:class 定義了物件能做什麼和有哪些屬性,而 new 就是在記憶體裡創造這個物件。

沒有 new 運算子的話,我們的 class 就像只有設計圖卻沒蓋房子:可以欣賞、討論,但你沒辦法在 alcantara 沙發上跳或灑茶。

如果 class 是 pizza 食譜,那 new 就是照著食譜做 pizza 的廚師。物件就是成果:裝在盒子裡、可以直接吃的 pizza。

語法

來看看怎麼用這個萬能的 new。假設我們有個 Contact class,基本語法如下:

Contact cont = new Contact();
new 創建物件
  • Contact 在左邊 — 這是我們要創建的變數型別。
  • cont — 變數名稱(取有意義的名字,不然 debug 會很痛苦)。
  • new Contact() — 呼叫 new 運算子,創建一個 Contact 型別的物件。

在記憶體裡

當這段程式碼執行時,作業系統會為新物件保留一塊記憶體,然後回傳一個指標(地址),這個物件就「住」在那裡。這個指標會存到 cont 變數裡。

示意圖

+------------------+             +--------------------+
|  變數 cont       | --------->  |   Contact 物件     |
+------------------+             +--------------------+
          |
          |       (包含名字、電話、email、...)
          |
         地址

2. 創建聯絡人物件

在前面的例子我們設計了這樣的 class:

public class Contact
{
    public string Name;
    public string Phone;
    public string Email;
}

現在來創建一個新的 Contact 物件:


Contact friend = new Contact();
friend.Name = "伊萬 伊萬諾夫";
friend.Phone = "+1-999-123-45-67";
friend.Email = "ivan@example.com";

Console.WriteLine($"名字: {friend.Name}, 電話: {friend.Phone}, Email: {friend.Email}");

這裡發生了什麼:

  1. new Contact() 創建物件。
  2. 給它的欄位賦值。
  3. 把資料印出來。

範例 2:

來玩玩多個聯絡人——再創一個物件:

Contact boss = new Contact();
boss.Name = "阿納斯塔西婭·謝爾蓋耶芙娜";
boss.Phone = "+1-888-765-43-21";
boss.Email = "nastya@company.com";

Console.WriteLine($"老闆: {boss.Name}, 電話: {boss.Phone}");

是不是很像幫每個朋友填一份表?物件就是這樣運作的:每個實例都有自己獨立的值,互不干擾!

3. 使用物件陣列

如果我們要存不只一兩個,而是十個聯絡人,最合理的方式就是用陣列:


Contact[] contacts = new Contact[3];           // 3 個物件的陣列

contacts[0] = new Contact();
contacts[0].Name = "丹尼斯";
contacts[0].Phone = "+7-911-111-22-33";

contacts[1] = new Contact();
contacts[1].Name = "瑪麗亞";
contacts[1].Phone = "+7-915-123-45-67";

contacts[2] = new Contact();
contacts[2].Name = "彼得";
contacts[2].Phone = "+7-921-543-21-00";

// 把大家都印出來
for (int i = 0; i < contacts.Length; i++)
{
    Console.WriteLine($"聯絡人 {i+1}: {contacts[i].Name}, {contacts[i].Phone}");
}

重點:我們對每個陣列元素都用 new只創建陣列不會自動創建物件,它只是準備好放指標的位置而已。

4. new 運算子和預設值

有時候會有人問——如果我只宣告一個 Contact 變數,但沒用 new 給它物件,會怎樣?


Contact someContact;
someContact.Name = "錯誤";    // 編譯錯誤!

如果你寫成這樣:

Contact someContact = null;

那你只要一碰 someContact.Name,程式就會「爆掉」,出現超有名的例外:

System.NullReferenceException: 物件參考未設定為物件的實例。

為了避免這種事,記得用 new 初始化物件再用。

5. 呼叫建構子

當你寫 new Contact(),這時會呼叫一個特別的方法——建構子。目前我們的 class 沒有自己寫建構子,所以會自動用預設建構子,這會創建物件並把所有欄位設成預設值(null 對 reference type,數字則是 0)。

下一堂課你會學到怎麼寫自己的建構子——像是直接傳名字和電話。現在我們只能用無參數建構子。

生活中的例子

new 操作物件是每個 C# 工程師的日常。想像一下,你:

  • 在網站創建用戶——程式裡就會有個新的 User 物件。
  • 在網路商店開訂單——就會有新的 Order
  • 輸入書本資料——就有新的 Book 物件。

任何現代 C# 程式裡,你都會看到成千上萬行有 new 的程式碼。

創建物件前的記憶體狀態


            Contact firstContact; // 變數,但還沒指向任何東西
+--------------------------+
|   firstContact           |---->  null (什麼都沒有!)
+--------------------------+

創建物件後


Contact firstContact = new Contact();
+--------------------------+                 +----------------------+
|   firstContact           |---------------->|   Contact 物件       |
+--------------------------+                 +----------------------+

6. 實用範例

假設我們想讓使用者透過鍵盤輸入來創建新聯絡人:


Console.WriteLine("請輸入名字:");
string name = Console.ReadLine();

Console.WriteLine("請輸入電話:");
string phone = Console.ReadLine();

Contact newContact = new Contact();
newContact.Name = name;
newContact.Phone = phone;

Console.WriteLine($"已儲存聯絡人: {newContact.Name}, {newContact.Phone}");

這樣每次用戶輸入都會在記憶體裡創建一個獨立的物件,可以存、改、印出來——想怎麼玩都行!

7. 常見錯誤和有趣的陷阱

錯誤 #1:忘了在操作物件前呼叫 new
如果只宣告變數沒初始化,你可能會遇到編譯錯誤,或在執行時遇到 NullReferenceException。這是經典:宣告物件後,如果真的要用,馬上用 new 創建它。

錯誤 #2:創建了物件陣列但沒創建物件本身。
很多人會掉進這個坑:你創建了一個 Contact[] 陣列,但裡面其實只是 null 的集合。只要你碰 contacts[0].Name 就會爆掉。記得要先初始化每個元素:contacts[i] = new Contact();

錯誤 #3:把方法和屬性搞混。
有時新手會以為方法可以像欄位一樣用:寫 student.GetName 而不是 student.GetName()。如果你沒馬上用結果,這樣寫還不會報錯——但只要你想把「方法」當值用,編譯器就會罵你。記得:方法一定要加括號,即使沒參數也要。

留言
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION