C#程式設計利器之二:結構與列舉(Structure and enumeration)

iDotNetSpace發表於2009-05-15

     在上一篇文章中,介紹了類如何封裝程式中的物件.而實際中,出了類可以封裝物件外,結構和列舉也可以封裝一些物件,本文將著重介紹結構和列舉這兩個知識點的相關應用.

 

一. 結構(Structure)

     什麼是結構(Structure)?在C#裡,Struct是一種值型別,通常用來封裝小型相關變數組,和類有很大的相似度.同類一樣,它不但可以包含不同資料型別資料。還可以包含複合型別(陣列,結構,DateTime等等)除了以名字/值方式出現還可以有屬性和方法,所以說結構是一種強大的複合型資料。

 

    1. 使用類封裝物件的屬性

      以圖書來作為示例來分析,圖書包括圖書編號,圖書名稱,圖書作者以及出售價格等.我們平時所通常都是使用類來封裝這些資訊,如下:

 1/**////


 2/// 圖書物件
 3///

 4public class Books
 5{
 6    public int bookId;
 7    public string bookName;
 8    public string bookAuthor;
 9    public double bookPrice;
10}
 

     2. 使用結構封裝物件的屬性

       其實出了使用類來封裝,我們還可以使用結構來封裝,實現如下:

 1/**////


 2/// 使用結構封裝圖書資訊
 3///

 4public struct Book
 5{
 6    public int bookId;
 7    public string bookName;
 8    public string bookAuthor;
 9    public double bookPrice;
10}
 

    3. 結構可以定義構造方法

 1/**////


 2/// 使用結構封裝圖書資訊
 3///

 4public struct Book
 5{
 6    /**////
 7    /// 可定義構造方法
 8    ///

 9    public Book()
10    {
11        //
12    }
13
14    public int bookId;
15    public string bookName;
16    public string bookAuthor;
17    public double bookPrice;
18}
 

    4. 可以使用new進行初始化

 1/**////


 2/// 使用結構封裝圖書資訊
 3///

 4public struct Book
 5{
 6    /**//////
 7    ///// 可定義構造方法
 8    /////

 9    //public Book()
10    //{
11    //    //這裡需要注意,當結構中已有帶引數的構造方法時,則不能定義無引數的構造方法
12    //}
13
14    public Book(int id, string name, string author, double price)
15    {
16        bookId = id;
17        bookName = name;
18        bookAuthor = author;
19        bookPrice = price;
20    }
21    public int bookId;
22    public string bookName;
23    public string bookAuthor;
24    public double bookPrice;
25}
 

    5. 結構可以實現介面

 1/**////


 2/// 介面
 3///

 4public interface IBook
 5{
 6    DataSet QueryAll();
 7}
 8
 9/**////
10/// 結構實現介面
11///

12public struct BookComponent : IBook
13{
14    public DataSet QueryAll()
15    {
16        return null;
17    }
18}
 

    6. 類和結構的區別

      從上面可以看出,無論是使用類還是結構,都可以用來封裝物件的屬性.當然出了相同點外,兩者之間還是有很大的不同,大體如下:    

     型別:類是引用型別,結構是值型別.

     繼承:類可繼承,結構不能繼承.結構不能繼承其他的結構和類,或是被用作其他結構或類的基類.

     構造方法與析夠函式:結構可以定義構造方法,但不能定義析夠函式.類既可以定義構造方法,也可定義析夠函式.

     物件建立:可以使用new進行初始化,或進行手工初始化.類和結構都可以.

     結構與介面:結構可以實現一個或多個介面. 如上:public struct BookComponent:IBook{  //....}.

     多型: 結構與介面之間是支援多型的.如上面的結構實現介面為例,多型:IBook book = new BookComponent();

 

二. 列舉(Enumeration)

     什麼是列舉(Enumeration)?列舉可以理解為通過預定義列出所有值的識別符號來定義一個有序集合,這些值的次序和列舉說明中的識別符號的次序一致的. 通常用於定義一些不變的序列,如一年四個季節,一禮拜為七天等等. 可以通過enum來定義(這裡主要是針對C#語言的實現,其實在JAVA語言裡也是通過enum來定義).

    

     1. 列舉的定義形式

        修飾符 enum 列舉名

        {

            識別符號1,

            識別符號2,

            ..........,

            識別符號n

        }

       如下則為一個完整的列舉定義:

 1/**////


 2/// 技術方向
 3///

 4public enum TechnologyDirection
 5{
 6    CPlusPlus程式設計師,
 7    Java程式設計師,
 8    DotNet程式設計師,
 9    架構設計師,
10    開發組長,
11    需求分析師
12}
 

    2. 另類列舉定義(可以初始化值)

 1==============以下為第一種定義方法==============
 2/**////


 3/// 季節
 4///

 5public enum Season
 6{
 7    SPRING,   //春天
 8    SUMMER,   //夏天
 9    AUTUMN,   //秋天
10    WINTER    //冬天
11}
12==============以下為第二種定義方法==============
13/**////
14/// 季節
15///

16public enum SeasonTwo
17{
18    SPRING = 0,   //春天
19    SUMMER = 1,   //夏天
20    AUTUMN = 2,   //秋天
21    WINTER = 3    //冬天
22}
23=================TEST===================
24class Program
25{
26   static void Main(string[] args)
27   {
28      //以上兩種定義方法效果都一樣
29       Console.WriteLine(Season.AUTUMN);   
30      Console.WriteLine(SeasonTwo.AUTUMN); 
31      //執行結果都為:AUTUMN
32   }
33}
      如果不初始化值則從0開始,實際上面兩種定義方式定義得到的都是一個效果.

 

   3. 物件的形式實現

      何為物件的形式實現呢? 其實這個很簡單,也就是將需要列舉的標識定義在物件裡,通過物件的特性將其封裝.詳細如下程式碼:

 1public class SeasonOne
 2{
 3    public static readonly SeasonOne SPRING = new SeasonOne("春天");
 4    public static readonly SeasonOne SUMMER = new SeasonOne("夏天");
 5    public static readonly SeasonOne AUTUMN = new SeasonOne("秋天");
 6    public static readonly SeasonOne WINTER = new SeasonOne("冬天");
 7
 8    public SeasonOne(string name)
 9    {
10        this.name = name;
11    }
12
13    //成員
14    private string name;
15    public string Name
16    {
17        get { return name; }
18        set { name = value; }
19    }
20}
      以上的形式實現很簡單, 不過好象已經偏離了"列舉(enum)",因為實現已經由列舉轉向為了類(class)物件來實現了.定義一成員屬性,通過構造方法初始化,在類裡定義需要列舉的只讀成員,通常不建議使用此方式來實現.  我們可以這樣來測試:

1class Program
2{
3    static void Main(string[] args)
4    {
5        Console.WriteLine(SeasonOne.AUTUMN.Name);
6        //執行結果:秋天
7    }
8}
 

    4. Java中的列舉

       在與C#語言一樣流行的JAVA中,列舉還存在著另類故事,作為一個物件導向的開發者或是既將成為物件導向的開發者的你,我想了解下另類語言的某些特性是有必要的.在JAVA中,列舉除了上面所介紹的相關功能外,還有其他的一些功能,下面將簡單的介紹下這些功能的應用.

     列舉裡定義抽象方法,識別符號實現抽象方法

 1enum Operator{
 2    ADD {
 3        public double calculate(double a,double b){
 4            return a+b;
 5        }
 6    },
 7    SUBSTRACT{
 8        public double calculate(double a,double b){
 9            return a-b;
10        }
11    },
12    MULTIPLY{
13        public double calculate(double a,double b){
14            return a*b;
15        }
16    },
17    DIVIDE{
18        public double calculate(double a,double b){
19            return a/b;
20        }
21    };
22    public abstract double calculate(double a,double b);
23}
 

     列舉裡定義屬性欄位和構造方法

 1enum Course{
 2    COREJAVA("zhangsan"),  //zhangsan學CoreJava
 3    WEB("lisi"),           //lisi學Web
 4    EJB ("wangwu");        //wangwu學EJB
 5
 6    String name;
 7    Course(String name){
 8        this.name=name;
 9    }
10    public String getName(){
11        return this.name;
12    }
13}
 

     屬性欄位,構造方法及抽象方法並存

enum Course{
    COREJAVA("zhangsan"){
        public void study(){
            System.out.println("Study Corejava");
        }
    },
    WEB("lisi"){
        public void study(){
            System.out.println("Study Web");
        }
    },
    EJB ("wangwu"){
        public void study(){
            System.out.println("Study EJB");
        }
    };
    String teachName;
    Course(String name){
        this.teachName=name;
    }
    public String getName(){
        return this.teachName;
    }
    public abstract void study();
}
 

三. .NET Framework中的列舉基類

    在.NET Framework中列舉基類(Enum)是一抽象類,位於System名稱空間下,繼承了ValueType類和IComparable, IFormattable, IConvertible介面,這裡以一個簡單的文字編輯作為示例介紹下列舉在實際中的應用.

    簡單文字編輯器示例執行圖如下:

                                           

     從上圖很容易看出,此文字編輯器主要是用於設定字型樣式,其實在實現這個簡單文字編輯器的時候就是使用的字型樣式列舉(FontStyle),FontStyle的原始碼定義如下:

 1// 摘要:
 2//     指定應用到文字的字形資訊。
 3[Flags]
 4public enum FontStyle
 5{}{
 6    // 摘要:
 7    //     普通文字。
 8    Regular = 0,
 9    //
10    // 摘要:
11    //     加粗文字。
12    Bold = 1,
13    //
14    // 摘要:
15    //     傾斜文字。
16    Italic = 2,
17    //
18    // 摘要:
19    //     帶下劃線的文字。
20    Underline = 4,
21    //
22    // 摘要:
23    //     中間有直線通過的文字。
24    Strikeout = 8,
25}
 

      要實現上圖示的簡單文字編輯器很簡單,基本思路就是通過點選上面字型樣式設定功能鍵,設定編輯區域的文字字型樣式,這實現很簡單.在此,我就直接把程式碼貼出來,有不清楚之處可從下面我提供的示例程式碼下載連線下載本文示例程式碼檢視.

 1private void SetStyle(object sender,EventArgs e)
 2{}{          
 3    ToolStripButton btn = sender as ToolStripButton;
 4    FontStyle. fontStyleContent = this.rchTxtContent.SelectionFont.Style;
 5    FontStyle. BtnFont = ( FontStyle)(Enum.Parse(typeof(FontStyle),btn.Tag.ToString()));
 6    if ((fontStyleContent | BtnFont) == fontStyleContent)
 7    {
 8        fontStyleContent = ~BtnFont & fontStyleContent;
 9    }
10    else
11    {}{
12        fontStyleContent = fontStyleContent | BtnFont;
13    }
14    this.rchTxtContent.SelectionFont = new Font(this.rchTxtContent.SelectionFont.FontFamily,
15                                                this.rchTxtContent.SelectionFont.Size,
16                                                fontStyleContent,
17                                                this.rchTxtContent.SelectionFont.Unit);
18}
 

本文就介紹於此,更多請關注本系列後續文章,本文示例程式碼下載

 

注: 原創文章,轉載請註明出處: http://beniao.cnblogs.com/http://www.cnblogs.com/   作者 : Beniao

 

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/12639172/viewspace-598255/,如需轉載,請註明出處,否則將追究法律責任。

相關文章