C# 入門指南

單元 10 - 類別

~~學習進度表~~

C# 中用關鍵字 (keyword) class 定義類別 (class)

class

類別最基本的就是定義欄位 (field) 以及方法 (method) ,例如

class Demo
{
    public string M;

    public string DoSomething(string s)
    {
        return s;
    }

    public void PrintM()
    {
        Console.WriteLine(m);
    }
}

欄位為物件特定的值,例如賽車遊戲的車輛物件有顏色、樣式、速度等等,方法為物件去做的特定工作,例如車輛物件要啟動、加速、轉彎等等。

關鍵字 class 後面空一格所接的識別字為類別名稱

class Demo

此例的類別名稱為 Demo ,底下大括弧縮排的第一行為宣告欄位

public string M;

「欄位」的英文原文為 fieldfield 比較多用在資料庫中資料表的地方,實際上這個詞 field 在物件導向程式設計中通常會翻成「屬性」,然而「屬性」在 C# 官方文件中指的是 property ,關於「屬性」在下一個單元才會詳加介紹,這裡依照微軟提供的 C# 官方文件的用詞「欄位」,因為實際在微軟提供的 .NET 環境寫 C# 程式,所有的中文提示訊息都是採用微軟提供的機器翻譯。

類別 Demo 只宣告了一個欄位,底下定義兩個方法,首先是 DoSomething()

public string DoSomething(string s)
{
    return s;
}

關鍵字 public 是最大的開放權限,這裡將 DoSomething() 宣告為 public ,才能其他類別的 Main() 方法中呼叫 DoSomething() ,然後 string 是指 DoSomething() 的回傳值型態 (return type) ,小括弧裡頭放參數列,參數列 (parameter list) 是以逗號間隔的型態名稱與參數 (parameter) 名稱,像是

型態1 參數1, 型態2 參數2, 型態3 參數3, ...

這裡 DoSomething() 只有一個 string 型態的參數 s

參數的原文為 parameter ,這是定義方法的時候用的詞,另外有一個詞 ---- 引數,引數的原文為 argument ,在呼叫方法時實際提供的值稱為 argument ,但是其實 parameterargument 是同一個概念,本書均採用「參數」做說明。

DoSomething() 裡頭只有一行,這一行是 return 陳述 (statement)

return s;

return 用來回傳數值,回傳的數值就是 return 之後的運算式,此例直接回傳參數 s

如果方法不需要回傳值 (return value) ,就要將方法宣告為 void ,像是第二個方法就宣告成 void

public void PrintM()
{
    Console.WriteLine(m);
}

PrintM() 就是印出欄位 M 的值。

我們將以上 Demo 的定義放進 ClassDemo01 的命名空間 (namespace) 中,然後在 Program 類別寫 Main() 方法來建立 Demo 型態的物件,完整程式如下

using System;

namespace ClassDemo01
{
    class Demo
    {
        public string m;

        public string DoSomething(string s)
        {
            return s;
        }

        public void PrintM()
        {
            Console.WriteLine(m);
        }
    }

    class Program
    {
        static void Main(string[] args)
        {
            Demo d = new Demo();
            d.m = "There is no spoon.";
            string s = d.DoSomething("Free your mind.");
            Console.WriteLine(s);
            d.PrintM();
        }
    }
}

//《程式語言教學誌》的範例程式
// http://kaiching.org/
// 專案:ClassDemo01
// 檔名:Program.cs
// 功能:示範 C# 的類別
// 作者:張凱慶

Main() 預設的參數為字串陣列的 args

static void Main(string[] args)
{
    Demo d = new Demo();
    d.m = "There is no spoon.";
    string s = d.DoSomething("Free your mind.");
    Console.WriteLine(s);
    d.PrintM();
}

Main() 沒有回傳值,因此宣告為 void ,然後 void 之前還有個 static 關鍵字,這個關鍵字是個修飾詞, static 就中文而言是靜態的意思,在程式裡頭是指可以直接透過類別名稱呼叫,因此呼叫

Program.Main()

就會執行這個程式,這也是 C# 程式的執行方式, C# 可執行程式的執行程式碼就會寫在 Main() 方法中。

下面先建立變數 dDemo() 型態的物件,注意變數 d 為參考 (reference)

Demo d = new Demo();

然後用 d 加上小數點,將欄位 M 設定為 "There is no spoon."

d.m = "There is no spoon.";

接下來呼叫 DoSomething() ,以 "Free your mind." ,然後以變數 s 接收回傳值

string s = d.DoSomething("Free your mind.");

下一行再印出 s 的值

Console.WriteLine(s);

最後, d 再呼叫 PrintM() 方法

d.PrintM();

此例執行結果如下

C:\ClassDemo01> dotnet run
Free your mind.
There is no spoon.
C:\ClassDemo01>

以上介紹了類別設計的最基本的兩個項目,也就是欄位及方法,下一個單元繼續討論建構子 (constructor) 與屬性 (property) 。

相關教學影片

上一頁 單元 9 - 列舉與結構
回 C# 入門指南首頁
下一頁 單元 11 - 建構子與屬性
回 C# 教材首頁
回程式語言教材首頁
中英文術語對照
類別class
建構子constructor
欄位field
關鍵字keyword
方法method
命名空間namespace
參數parameter
參數列parameter list
屬性property
參考reference
回傳值型態return type
回傳值return value
陳述statement
參考資料
1. C# 語言教學課程 | Microsoft Docs - 類別與物件
2. C# 程式設計手冊 | Microsoft Docs - 類別
重點整理
1. 類別用關鍵字 class 定義,裡面可以定義欄位及方法,欄位為物件特定的值,方法為物件去做的特定工作。
2. C# 中的欄位原文為 field ,另有屬性,原文為 peoperty
3. 方法有參數列,參數為提供給方法計算的值,方法也可以有回傳值,回傳值就是回傳計算結果。
4. 可執行的 C# 類別要定義 staticMain() 方法,這個方法可由驅動器直接呼叫。
5. 利用類別定義的變數為參考。
問題與討論
1. 為什麼類別要有欄位跟方法?想一想,這跟物件的意涵有什麼關聯?
2. 為什麼方法有參數列?回傳值的目的是什麼?
3. 欄位跟屬性有何不同?為什麼有了欄位又要有屬性?
練習
1. 建立一個專案 Exercise1001 ,裡頭設計一個類別 IntegerDemoIntegerDemo 有一個 int 的欄位 result ,另有一個沒有回傳值的方法 add()add() 有一個 int 參數,呼叫 add() 時會把參數與 result 相加,結果儲存在 result ,執行部分先將 result 設定為 25 ,再呼叫 add()24 當參數。
2. 承上題,另建立一個專案 Exercise1002 ,改成由使用者輸入兩個整數。
3. 承上題,另建立一個專案 Exercise1003 ,加入方法 subtract()subtract() 沒有回傳值另外需要一個 int 參數,同樣呼叫 subtract() 是將 value 減去參數值,最後結果儲存在 result
4. 承上題,另建立一個專案 Exercise1004 ,繼續擴充 IntegerDemo ,加入乘法的方法。
5. 承上題,另建立一個專案 Exercise1005 ,繼續擴充 IntegerDemo ,加入除法的方法。
6. 建立一個專案 Exercise1006 ,仿照 IntegerDemo ,將方法改成計算階層值,結果儲存在 result
7. 寫一個程式 Exercise1007 ,仿照 IntegerDemo ,將成員函數改成計算費氏數列,結果儲存在 result