[VS2010/.NET 4.0 自我修煉-02.01] 使用「類別圖表」設計列舉以及結構

  • 5515
  • 0
  • 2015-11-02

[VS2010/.NET 4.0 自我修煉-02.01] 使用「類別圖表」設計列舉以及結構

 

本篇要介紹的是使用「類別圖表」來設計列舉 (Enumeration) 以及結構 (Struct)。

首先會對列舉跟結構做個簡單的介紹,然後再示範如何利用「類別圖表」來設計。

 

 

一、列舉跟結構是什麼?

1. 列舉 (Enumeration)

列舉的用途跟它中文翻譯的字面意義相同,

可以將內含的每個常數一一列出以供程式使用。

在列舉當中可以放入任何 char 以外的「整數型別」實體物件來當作上述的常數,

若不指定型別,則這些常數的型別預設會是 int,例如: 


public enum BloodType : int
{
    /// <summary>
    /// A型
    /// </summary>
    A型,
    /// <summary>
    /// B型
    /// </summary>
    B型,
    /// <summary>
    /// AB型
    /// </summary>
    AB型,
    /// <summary>
    /// O型
    /// </summary>
    O型,
}

上面這段 code 定義了一個叫做 BloodType 的列舉,

其用法非常的簡單,只要用列舉名稱呼叫列舉常數即可,例如:

Human man = new Human();
man.BloodType = BloodType.A型;

上述的  Human 型別有一個 BloodType 列舉型別的屬性叫做 BloodType (請注意前後兩個 BloodType 不一樣),

當我們要指派 value 給這個屬性的時候,只要使用 BloodType 列舉名稱來呼叫底下的各種血型,

就像上面那段 code 裡面寫的:BloodType.A型

當我們要將某個列舉常數換成它對應的整數型別的值時,可以利用這樣的做法:int intA = (int)BloodType.A型;

而當我們要知道某個整數值對應的列舉常數名稱時,可以利用這樣的做法:string nameA = Enum.GetName(typeof(BloodType), 0);

 

2. 結構 (Struct)

結構在理論上的用途比列舉多很多,但實際上的用途卻跟列舉差不多。

首先來說明理論上的用途:

我們能在結構中加入建構函式、常數、欄位、方法、屬性、索引子、運算子、事件和巢狀型別等等成員,

且設計結構的方式跟類別幾乎相同,但是結構具有以下限制:

  • 結構宣告內不能初始化欄位,除非將其宣告為 const 或 static。

01.在結構中不能有執行個體欄位初始設定式

  • 結構不可宣告預設建構函式 (沒有參數的建構函式) 或解構函式。

02.結構無法包含明確無參數的建構函式 02.結構無法包含明確無參數的解構函式

  • 結構可以宣告含有參數的建構函式。

08.結構可以宣告含有參數的建構函式

  • 結構無法繼承自類別或其他結構 (因為不能繼承,所以就不可以將結構的存取修飾詞設定為 protected)。

04.介面清單中的型別'string'不是介面

  • 結構不能成為類別的基底 (無法被其他類別繼承)。所有結構都是從 System.Object 的 System.ValueType 直接繼承而來。

09.結構不能成為類別的基底 10.結構都是從 System.Object 的 System.ValueType 直接繼承 

  • 結構可實作介面。

03.結構可實作介面 

  • 結構是在指派時複製的。當指派結構給新變數時,就會複製所有資料,而新變數所做的任何修改都不會變更原始複本的資料。

05.新變數不影響原複本的欄位值1

  • 結構為實值型別,而類別則是參考型別。

06.結構為實值型別

  • 與類別不同的是,結構不需使用 new 運算子就能執行個體化。

07.結構不需使用 new 運算子就能執行個體化 

  • 結構可以用來當做可為 Null 的型別,而且可以對其指派 null 值。

11.結構可以用來當做可為 Null 的型別

 

 

二、設計列舉型別

1. 在「類別圖表」的設計檢視空白處點一下滑鼠右鍵,選擇「加入」,再選擇「列舉」

12.加入列舉

  

2. 編輯一下列舉名稱、存取修飾詞以及檔名,好了之後點一下「確定」按鈕

13.編輯一下列舉名稱、存取修飾詞以及檔名

  

3. 之後可以看到「類別圖表」裡面出現一個新項目,而且「方案總管」也多了一支 BloodType.cs 檔案

14.產生了列舉

 

4. 編輯一下類別細節如下:

(此處因為篇幅關係,所以省略太細節的編輯部分,但大致上都跟上一篇「[VS2010/.NET 4.0 自我修煉-01] 初探 Visual Studio 2010 Ultimate 內建的 UML 工具」所介紹的編輯方式一樣~~~)

15.編輯一下類別細節如下

 

5. 來看看編輯後的類別圖表項目以及類別檔案

 16.編輯後的類別圖表項目以及類別檔案

 

 

三、設計結構

1. 一樣在「類別圖表」的設計檢視空白處點一下滑鼠右鍵,選擇「加入」,再選擇「結構」

17.加入結構

  

2. 編輯一下結構名稱、存取修飾詞以及檔名,好了之後點一下「確定」按鈕

18.編輯一下結構名稱、存取修飾詞以及檔名

  

3. 之後可以看到「類別圖表」裡面出現一個新項目,而且「方案總管」也多了一支 BodyStruct.cs 檔案

19.產生了結構

  

4. 編輯一下類別細節如下:

(此處也因為篇幅關係,所以省略太細節的編輯部分,但大致上也都跟上一篇「[VS2010/.NET 4.0 自我修煉-01] 初探 Visual Studio 2010 Ultimate 內建的 UML 工具」所介紹的編輯方式一樣~~~)

20.編輯一下結構細節如下 

但如同第一點所述,這一個步驟要注意的事情比較多,比如說:

  • 結構不可宣告預設建構函式 (沒有參數的建構函式) 或解構函式
  • 結構可以宣告含有參數的建構函式。
  • 結構無法繼承自類別或其他結構 (因為不能繼承,所以就不可以將結構的存取修飾詞設定為 protected)。

21.無法繼承自其他類別

  • 結構不能成為類別的基底 (無法被其他類別繼承)。

22.不能成為類別的基底

  • 結構可實作介面。

23.可實作介面

 

  

四、結論

其實還是跟前一篇的結論一樣,筆者比較想要講解的是結構跟介面本身,

IDE 就是拿來當作輔助工具,所以請不要打筆者~~~ XDDD