首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> .NET 網頁程式設計 >> C# >> 關於C#

C# 程式設計利器之二:結構與列舉實戰應用

     編輯:關於C#

C# 結構與列舉:輕量型別封裝、列舉進階與 .NET Framework Enum 基類應用

除了類別,結構與列舉也是封裝資料的重要工具。結構為實值型別,適合小型資料群組;列舉定義有序常數集合。本文對比類別與結構、示範列舉多種定義方式、Java 列舉進階功能、字型樣式列舉實戰。

一、結構

1. 類別封裝書本資訊

public class Books
{
    public int bookId;
    public string bookName;
    public string bookAuthor;
    public double bookPrice;
}

2. 結構封裝書本資訊

public struct Book
{
    public int bookId;
    public string bookName;
    public string bookAuthor;
    public double bookPrice;
}

3. 結構可定義建構函式

public struct Book
{
    // 無參數建構函式:若已有帶參數建構式,不可再定義無參數版本
    // public Book() { }

    // 帶參數建構函式
    public Book(int id, string name, string author, double price)
    {
        bookId = id;
        bookName = name;
        bookAuthor = author;
        bookPrice = price;
    }

    public int bookId;
    public string bookName;
    public string bookAuthor;
    public double bookPrice;
}

4. 使用 new 初始化結構

Book b = new Book(1, "C# 入門", "作者", 350.0);

5. 結構實作介面

public interface IBook
{
    DataSet QueryAll();
}

public struct BookComponent : IBook
{
    public DataSet QueryAll() { return null; }
}

6. 類別 vs 結構 差異總表

特性類別結構
型別分類參考型別實值型別
繼承支援繼承不可繼承(隱含 sealed)
建構/解構可定義建構式與解構子可定義建構式,不可定義解構子
初始化new 或手動new 或手動
介面實作支援支援多介面
多型支援透過介面支援多型

二、列舉

1. 基本定義語法

修飾符 enum 列舉名
{
    識別符1,
    識別符2,
    ...
    識別符n
}

2. 完整範例:技術方向列舉

public enum TechnologyDirection
{
    CPlusPlus程式設計師,
    Java程式設計師,
    DotNet程式設計師,
    架構設計師,
    開發組長,
    需求分析師
}

3. 指定數值的兩種寫法(效果相同)

// 寫法一:隱含從 0 起始
public enum Season
{
    SPRING,   // 0
    SUMMER,   // 1
    AUTUMN,   // 2
    WINTER    // 3
}

// 寫法二:顯式指定
public enum SeasonTwo
{
    SPRING = 0,
    SUMMER = 1,
    AUTUMN = 2,
    WINTER = 3
}

// 測試
Console.WriteLine(Season.AUTUMN);      // AUTUMN
Console.WriteLine(SeasonTwo.AUTUMN);   // AUTUMN

4. 以類別模擬列舉(物件形式實作)

已偏離 enum 本質,不建議常規使用,僅供理解列舉物件化概念。
public class SeasonOne
{
    public static readonly SeasonOne SPRING = new SeasonOne("春天");
    public static readonly SeasonOne SUMMER = new SeasonOne("夏天");
    public static readonly SeasonOne AUTUMN = new SeasonOne("秋天");
    public static readonly SeasonOne WINTER = new SeasonOne("冬天");

    private string name;
    public string Name { get { return name; } set { name = value; } }

    public SeasonOne(string name) { this.name = name; }
}

// 使用
Console.WriteLine(SeasonOne.AUTUMN.Name); // 秋天

5. Java 列舉進階功能(C# 透過類別/介面模擬)

列舉成員實作抽象方法

enum Operator {
    ADD { public double calculate(double a,double b){ return a+b; } },
    SUBSTRACT { public double calculate(double a,double b){ return a-b; } },
    MULTIPLY { public double calculate(double a,double b){ return a*b; } },
    DIVIDE { public double calculate(double a,double b){ return a/b; } };
    public abstract double calculate(double a,double b);
}

列舉含欄位、建構函式

enum Course {
    COREJAVA("zhangsan"), WEB("lisi"), EJB("wangwu");
    String name;
    Course(String name){ this.name=name; }
    public String getName(){ return this.name; }
}

欄位、建構函式、抽象方法並存

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

三、.NET Framework Enum 基類應用:簡易文字編輯器字型樣式

簡易文字編輯器示意圖

FontStyle 列舉原始碼 (含 Flags 屬性)

[Flags]
public enum FontStyle
{
    Regular    = 0,
    Bold       = 1,
    Italic     = 2,
    Underline  = 4,
    Strikeout  = 8
}

按鈕點擊切換字型樣式核心邏輯

private void SetStyle(object sender, EventArgs e)
{
    ToolStripButton btn = sender as ToolStripButton;
    FontStyle fontStyleContent = this.rchTxtContent.SelectionFont.Style;
    FontStyle BtnFont = (FontStyle)Enum.Parse(typeof(FontStyle), btn.Tag.ToString());

    if ((fontStyleContent | BtnFont) == fontStyleContent)
    {
        // 已套用該樣式 -> 移除
        fontStyleContent = ~BtnFont & fontStyleContent;
    }
    else
    {
        // 未套用 -> 加入
        fontStyleContent = fontStyleContent | BtnFont;
    }

    this.rchTxtContent.SelectionFont = new Font(
        this.rchTxtContent.SelectionFont.FontFamily,
        this.rchTxtContent.SelectionFont.Size,
        fontStyleContent,
        this.rchTxtContent.SelectionFont.Unit);
}

重點整理

  • 結構為實值型別,適合小型、不可變、高頻建立的資料結構(如座標、色彩)。
  • 列舉預設底層型別 int,可指定 byte、short 等節省記憶體。
  • [Flags] 屬性讓列舉支援位元組合,配合 |、&、~ 運算子極適合選項切換場景。
  • Java 列舉功能更強(可含方法、介面實作),C# 通常以類別+介面模擬同等能力。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved