iT邦幫忙

2019 iT 邦幫忙鐵人賽

DAY 10
1
自我挑戰組

.net 後端起手式 30天認識 C# 系列 第 10

DAY 10 類別

類別

「類別」是 C# 最基本的型別。
類別是以單一單位結合狀態 (欄位) 和動作 (方法及其他函式成員) 的資料結構。
類別可以為動態建立的類別「執行個體」(稱為「物件」) 提供定義。
類別支援「繼承」和「多型」,這些是可供「衍生類別」將「基底類別」延伸及特製化的機制。

除了這個也要清楚一個觀念

System.Object 是所有實值型別和參考型別的隱含基底類別,包括使用者定義的結構和類別。

任何物件都可以轉成 object,因為 C# 裡所有型別都衍生於 object。

簡單說說什麼是類別,我認為類別就是把一個具體的東西拆成各個小塊,解釋起來有點怪,那我們就舉個例子,以會員來說,基本上就會有編號與名稱,除了這兩個基本條件我們在多一個方法印出會員資訊

static void Main (string[] args) {
  Member member = new Member ();
}
public class Member {
  public int id;
  public string name;
  public void Print () {
    Console.WriteLine ($"ID: {id}, Name: {name}");
  }
}

以 class 關鍵字來定義一個類別,public 存取修飾詞會在後面說明,Member 也就是我們「類別」的名稱,括弧內就是我們這類別的內容,有三個「成員」 id, name 是「屬性」而 Print 是「方法」,而 Main 函式裡的 member 則是類別為 Member 的「物件」。

我們可以使用成員存取運算子來獲得類別的成員,如果我們要去設定 id 為 1 和 name 為 米歐,然後使用 Print 來印出來的話可以這樣寫

Member member = new Member ();
member.id = 1;
member.name = "米歐";
member.Print();

以這種方式來初始化是不是有種怪怪的感覺,如果今天成員一多且每個都要賦值時,程式碼就會超級長(不易讀),所以類別有一種函式稱為建構式,當你在 new 出一個物件時,可以事先宣告成員變數值,我們來修改一下我們的會員類別

static void Main (string[] args) {
  Member member = new Member (1, "米歐");
  member.Print ();
}
public class Member {
  int id;
  string name;
  public Member (int id, string name) {
    this.id = id;
    this.name = name;
  }
  public void Print () {
    Console.WriteLine ($"ID: {id}, Name: {name}");
  }
}

在使用 Member 時就需輸入 id 與 name,在被使用時是不是變得很乾淨,簡單的new Member (1, "米歐")就宣告好一個成員物件了。

建構式無法傳回任何值,可以有很多的建構式也就是多載,下方會有多載的說明。

除此之外也可以看到我把 id, name 的 public 給拿掉了,可以自己試試看,是不是 member. 的成員裡少了這兩個,如果 class 沒有寫任何存取修飾詞,預設是 private,所以外部無法存取該 class 的成員

而在建構式內可以看到我使用了 this 關鍵字,因為成員與參數名稱一樣時,可以使用 this 代表這個 class 的 object,所以使用 this 存取成員 id 來區別參數 id。

題外話:自己動手修改範例程式碼來觀察會比較好懂。

多載

下文節錄至參考連結大大的文章

方法多載(Overloading)是指多個名稱相同但參數個數或型別不同的方法,編譯器依傳入參數的個數、型別與順序決定使用哪一個方法。

我在這邊簡單的示範一下

static void Main (string[] args) {
  int t1 = Add (1, 2);
  int t2 = Add (1, 2, 3);
  string t3 = Add ("A", "B");
}
static int Add (int i1, int i2) {
  return i1 + i2;
}
static int Add (int i1, int i2, int i3) {
  return i1 + i2 + i3;
}
static string Add (string str1, string str2) {
  return str1 + str2;
}

存取修飾詞

存取修飾詞是用來指定成員或類型的宣告存取範圍的關鍵字。

public, protected, internal, private 四個關鍵字組成的六組存取層級。

  • public:未限制存取。

  • protected:存取限於包含類別或衍生自包含類別的型別。

  • internal:存取限於目前組件。

  • protected internal:存取限於目前組件或衍生自包含類別的型別。

  • private:存取限於包含型別。

  • private protected:存取限於目前組件內包含類別或衍生自包含類別的型別。

存取修飾詞的相關資訊都在參考連結,因為如果撰寫的話,只會有程式碼範例,我不是很喜歡,所以請自行前往。

一些小結論

今天講了類別,如何撰寫類別與建構式,因為 C# 的 GC,所以本人幾乎沒有在寫解構式,所以不講解構式怕講錯,不知道 GC 是什麼的話可以到參考連結的資源釋放那篇觀看。

還有就是為什麼會提 Object 那段,因為覺得很重要但又不知道從何講起,所以想說有個觀念就好了。

因為 C# 不是什麼新技術,之前的文章與之後的文章,其實都有前人分享了,所以在拿捏內容時,主要都是以自己的經驗為主,如果無法更清楚的表達我都會在文末附上參考連結,雖然寫系列文前想說將參考文章分成,內文有參考的文章以及內文有提到的額外閱讀,把更多相關資訊附上去,如果有興趣或想了解更多的可以看額外閱讀。

寫到第十天了,雖然不是很多人在看,但還是有幾個人在看,畢竟我 F5 的次數頂多就 5 下確認內文而已,所以抱歉浪費你的時間看我在這 murmur。

感謝閱讀。

參考連結
C# 中的類別和物件 - C# 語言教學課程 | Microsoft Docs
存取修飾詞 (C# 參考) | Microsoft Docs
方法多載(Method Overloading)與 dynamic-黑暗執行緒
存取範圍定義域 (C# 參考) | Microsoft Docs
使用存取範圍層級的限制 (C# 參考) | Microsoft Docs
C# - 資源釋放的觀念整理 @ 山閣隱城 :: 痞客邦 ::


上一篇
DAY 09 陳述式(四)
下一篇
DAY 11 類別(二)
系列文
.net 後端起手式 30天認識 C# 30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言