CodeGym /課程 /C# SELF /類別宣告語法與結構

類別宣告語法與結構

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

1. 類別宣告的基本結構

想像一下:C# 的類別就像一棟建築的藍圖。在藍圖裡我們會描述有幾間房、牆壁什麼顏色、門窗在哪裡。類別裡則是描述物件有哪些屬性(像是名字、年齡)和它會做什麼(像是「打招呼」、「要求薪水」)。

類別宣告通常包含三個主要區塊:

  1. 存取修飾詞(publicprivateinternalprotected)— 誰可以用這個類別。為了簡單,我們現在都用 public,這樣類別「到處都看得到」。
  2. 關鍵字 class — 讓編譯器知道我們真的在描述一個類別。
  3. 類別名稱 — 按慣例首字母大寫。
  4. 大括號裡的類別主體 — 這裡描述類別的全部內容:欄位、屬性、方法。

簡單來說長這樣:

public class 類別名稱
{
    // 這裡會放類別的欄位、屬性和方法
}
C# 類別宣告

範例:學生類別

public class Student
{
    // 欄位(屬於物件的變數)
    public string Name;
    public int Age;
}

目前這個類別就像一個空箱子:我們說明了學生要有名字和年齡,但還沒教他會做什麼。

2. 類別欄位(fields)

欄位 就是屬於類別物件的變數。比如每個學生都該有自己的名字和年齡 — 所以這些會被寫成欄位:

public class Student
{
    public string Name;
    public int Age;
}

現在,當你建立一個 Student 物件時,每個物件都會有自己的名字和年齡。

建立物件的範例:

Student sasha = new Student();
sasha.Name = "薩沙";
sasha.Age = 20;

這裡我們建立了一個 sasha 物件,然後分別給它的欄位賦值。這種方式很適合新手起步(關於 constructor 我們下堂課會詳細聊)。

3. 類別方法(functions)

方法就是物件的「動詞」,也就是它的行為。它能做什麼事。比如學生可以打招呼。這時就在類別裡寫一個方法:

public class Student
{
    public string Name;
    public int Age;

    public void SayHello()
    {
        Console.WriteLine($"哈囉,我叫 {Name},我 {Age} 歲!");
    }
}

現在每個學生都可以「打招呼」— 而且會用自己的名字和年齡。

方法使用範例:

Student sasha = new Student();
sasha.Name = "薩沙";
sasha.Age = 20;
sasha.SayHello(); // 會顯示:哈囉,我叫 薩沙,我 20 歲!

4. 類別屬性(properties)

屬性 是「聰明的」欄位,可以在讀取或寫入時加上特殊邏輯。在現代 C#,屬性比欄位更常用,因為它們更靈活、可控。就像電力一樣:看起來很簡單,其實能做的事超多。


public class Student
{
    public string Name { get; set; }
    public int Age { get; set; }
}
類別屬性宣告

這裡 get; set; 會自動產生欄位,但未來可以加上邏輯。對類別使用者來說,屬性看起來跟欄位差不多。

範例:

Student katya = new Student();
katya.Name = "卡佳";
katya.Age = 18;
Console.WriteLine(katya.Name); // 卡佳

更多關於類別屬性的細節 — 之後的課會再聊 :P

5. 註解

雖然有點無聊但很重要!就像其他程式碼一樣,在類別裡也可以(而且應該)寫註解,說明為什麼需要這個欄位或方法:

public class Student
{
    // 學生名字
    public string Name { get; set; }
    
    // 學生年齡(單位:歲)
    public int Age { get; set; }

    // 學生打招呼
    public void SayHello()
    {
        Console.WriteLine($"哈囉,我叫 {Name},我 {Age} 歲!");
    }
}

這樣會讓程式碼更好讀,就算專案很大也不會迷路。

6. 存取修飾詞

存取修飾詞就像不同鎖的門。它們決定誰、從哪裡可以存取類別成員。主要的修飾詞有:

  • public: 到處都能存取(我們預設用這個)。
  • private: 只有這個類別內部能用。
  • internal: 只在目前的組件(project、library)內能用。
  • protected: 這個類別和它的子類別能用。

範例:一個對外隱藏的欄位:

public class Student
{
    private int age; // 只有 Student 裡面能用
    public string Name { get; set; }

    public void SetAge(int value)
    {
        if (value > 0)
            age = value;
    }

    public int GetAge()
    {
        return age;
    }
}

初學時大家常常全部都寫 public,這樣比較不會搞混,但實際專案這樣不好:有些細節最好藏起來。

7. 類別的 static 成員

有時候類別會有一些資料或方法,不是屬於某個物件,而是整個類別共用。這就是 static 成員(static members)。

比如:我們想要有一個學生總數的計數器。

public class Student
{
    public static int StudentsCount = 0;

    public string Name { get; set; }
    public int Age { get; set; }
}

存取 static 成員要用類別名稱:

Student.StudentsCount = 0;

每個物件有自己的屬性/欄位,但 static 是大家共用的。上面例子,如果有 10 個學生,每個有自己的 Name,但 StudentsCount 只有一個。

8. 範例:完整的學生類別(含方法)

我們來把全部內容組合起來,做一個功能完整、格式正確的學生類別:

public class Student
{
    // static 學生計數器 - 全部學生共用
    public static int Count = 0;

    // 名字和年齡 - 屬性
    public string Name { get; set; }
    public int Age { get; set; }

    // 建構子(constructor 之後會詳細講)
    public Student(string name, int age)
    {
        Name = name;
        Age = age;
        Count++; // 每建立一個物件就加一
    }

    // 打招呼的方法
    public void SayHello()
    {
        Console.WriteLine($"哈囉!我是 {Name}。我 {Age} 歲。");
    }
}

在主程式裡使用:

class Program
{
    static void Main()
    {
        Student sasha = new Student("薩沙", 20);
        Student katya = new Student("卡佳", 22);

        sasha.SayHello();
        katya.SayHello();

        Console.WriteLine($"學生總數: {Student.Count}");
    }
}

9. 程式碼組織:一個檔案 = 一個類別

在 .NET 裡,通常每個 public 類別都放在一個獨立檔案,檔名跟類別名一樣。例如:

Student.cs
|
|__ public class Student

而主程式檔(Program.cs)就是進入點和主要程式碼。這樣專案多類別時比較好找。

10. 操作類別和物件時常見錯誤

錯誤一:忘記大括號或放錯地方。
編譯器會馬上報錯,但有時候不太好找是哪裡出問題。特別是大括號跑掉時,在很長的程式碼裡找錯點會很頭痛。

錯誤二:在同一個命名空間裡宣告兩個同名類別。
這種「創意」編譯器不會接受。這樣也好,不然你自己都搞不清楚用到哪個類別。

錯誤三:不小心讓欄位和屬性同名。
這會讓你在存取類別成員時很混亂。就連老手有時也會頭痛:「我現在用的是欄位還是屬性?」

錯誤四:沒寫存取修飾詞。
預設類別會變成 internal,如果你在寫 library,這可能會讓外部無法存取這個類別。

錯誤五:用物件來存取 static 成員。
如果寫 student.Count 而不是 Student.Count,編譯器可能不會擋你,但這會讓人誤會。這樣看起來好像 Count 是屬於某個學生,其實是大家共用的。

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