.NET中的枚舉(Enum)

来源:http://www.cnblogs.com/mingjiatang/archive/2016/10/10/5947335.html
-Advertisement-
Play Games

摘要:.NET中的枚舉分為簡單枚舉和標誌枚舉,這次主要總結一下標誌枚舉適用條件,以及它的使用方法,併在文章的最後列舉枚舉使用的一些規範。 在剛接觸.NET的枚舉時,只用簡單的枚舉,對於標記枚舉,只知道是在枚舉類型加上 特性,然後給枚舉值賦予十六進位的值,並且書中還特別明確規定值必須是以2的指數才可以 ...


摘要:.NET中的枚舉分為簡單枚舉和標誌枚舉,這次主要總結一下標誌枚舉適用條件,以及它的使用方法,併在文章的最後列舉枚舉使用的一些規範。

在剛接觸.NET的枚舉時,只用簡單的枚舉,對於標記枚舉,只知道是在枚舉類型加上Flags特性,然後給枚舉值賦予十六進位的值,並且書中還特別明確規定值必須是以2的指數才可以,這樣可以方便在使用時,對多個枚舉值進行或運算。隨著對.NET的瞭解不斷的深入,現在終於明白了標誌枚舉的適用場合以及它的使用方法,因此在這裡總結一下。

標誌枚舉的適用條件

System.Drawing命令空間中有一個FontStyle標誌枚舉,專門用來設置字體的風格,有Blod、Italic、Regular、Strikeout、Underline這5種風格。當然我們需要設置字體為單個一種風格時,那麼FontStyle枚舉的用法和簡單枚舉沒什麼區別,比如,我們需要把字體風格為設置為粗體,代碼如下:

System.Drawing.Font font = new System.Drawing.Font("宋體",12,FontStyle.Bold);

但是,如果我們需要設置字體的風格為粗體的同時還要需要斜體和下劃線呢?對於這種情況,簡單枚舉就不適用了,這就必須使用標誌枚舉的進行組合才能辦到了,代碼如下:

System.Drawing.Font font = new System.Drawing.Font("宋體",12,                                                              FontStyle.Bold|FontStyle.Italic|FontStyle.Underline);

通過這樣的組合就能夠達到我們想要的效果。

自定義FontStyle標誌枚舉,一探究竟

下麵我們自己設計一個FontStyle,看看它的內部是如何實現的。代碼如下:

[Flags]
public enum FontStyle: byte
{ 
    Bold=0x01,
    Italic = 0x02,
    Regular = 0x04,
    Strikeout=0x08,
    Underline=0x10,
}

上面的定義了一個FontStyle枚舉,該枚舉繼承byte類型,通過加上Flags特性,使它成為標誌枚舉,並且為每一個枚舉值賦值一個十六進位的值,每一個值都是2的指數值。下麵將詳細解釋一些為什麼要使用2的指數來進行賦值。

為什麼使用2的指數值對枚舉進行賦值

首先我們要明白,二進位的或運算,或運行無非就4種情況,

0|0=0;  0|1=1;  1|0=1;  1|1=1;

那麼二進位10101010和01010101進行或運算就等於11111111,明白了二進位的或運算,再仔細想想,一個位元組8位二進位,可以代表0-255。其中1,2,4,8,16,32,64,128是2的指數,分別代表的二進位的00000001,00000010,00000100,00001000,00010000,00100000,01000000,10000000,它們的每個取值剛好是將8位中的某一位設為1。那麼這8個值以及它們任意組合(或運算)剛好能夠代表種情況(其中是單個枚舉,其他都是組合),對標誌枚舉使用2的指數值進行賦值,能夠進行任意的組合,並且任意組合後的值不會有重覆。這就是為什麼要使用2的指數值對標誌枚舉進行複製的原因。順便這裡再多說一句,賦值的時候為什麼不用10進位,而是用16進位的表示法,前面我們分析了,標誌枚舉的組合最後都將進行二進位的或運算,而我們在賦值的時候用16進位會更加表現明顯,因為每一個16進位的數值,剛好代表二進位4個位,所以兩個16進位的數就能代表一個位元組,比如0x11,我們化為二進位,只需要對兩個1分別換算4個二進位位就行了,1=0001,所以0x11就代表00010001,如果用十進位17來表示,就沒那麼輕易地看出它的二進位表示。

如何處理組合枚舉

當我們把標誌枚舉賦值為2的指數值之後,我們就可以組合的使用這些枚舉值,以期達到我們想要的效果,那麼在函數設計中,我們是如何來處理傳入進來的枚舉組合值呢?其實也非常簡單,正是因為他們任意的組合都不會重覆,因此每一個數值可以代表其中的一個枚舉值或者是一個組合,比如,FontStyle.Bold|FontStyle.Italic|FontStyle.Underline這個組合所代表的數值就位0x01|0x02|0x10=19.

下麵設計一個函數處理傳入進來的枚舉值。代碼如下:

static void Test(FontStyle fontStyle)
{
    switch ((byte)fontStyle)
    { 
        case 1:
            Console.WriteLine("Bold");
            break;
        case 2:
            Console.WriteLine("Italic");
            break;
        case 3:
            Console.WriteLine("Bold&Italic");
            break;
        case 4:
            Console.WriteLine("Regular");
            break;
        case 6:
            Console.WriteLine("Regular&Italic");
            break;
        case 8:
            Console.WriteLine("Strikeout");
            break;
        case 9:
            Console.WriteLine("Strikeout&Bold");
            break;
        case 10:
            Console.WriteLine("Strikeout&Italic");
            break;
        case 11:
            Console.WriteLine("Strikeout&Italic&Bold");
            break;
        case 16:
            Console.WriteLine("Underline");
            break;
        case 19:
            Console.WriteLine("Bold&Italic&Underline");
                break;
            //else
    }
}

因為枚舉在CLR內部實現可以看做是數值類型。在Test函數內部我們需要用Switch去判斷傳入的枚舉值,確定是否單個枚舉還是組合後的值,並對其做出相應的處理。下麵給出測試代碼。

static void Main(string[] args)
{
    Test(FontStyle.Bold);
    Test(FontStyle.Strikeout|FontStyle.Italic);
    Test(FontStyle.Bold|FontStyle.Italic|FontStyle.Underline);
    Console.ReadKey();
            
}

測試結果如下:

2016_10_96af7a07-7fcf-46f5-a728-f3f92c4effa1

總結一些設計枚舉的規範

  • 簡單枚舉的命名採用單數形式。
  • 不要使用Enum、Flag、Flags作為枚舉類型的尾碼。
  • 不要給枚舉值的命名加上枚舉類型名首碼,比如FontStyleBlod這樣是不規範的。
  • 使用枚舉代替一些固定的常量集合。
  • 使用枚舉作為參數、屬性、返回值,來保證該API是強類型的API。
  • 考慮給枚舉提供一個None=0的枚舉值。
  • 給標誌枚舉賦值為2的指數值。

您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 項目相關的快捷鍵 Ctrl + Shift + B = 生成項目 Ctrl + Alt + L = 顯示Solution Explorer(解決方案資源管理器) Shift + Alt+ C = 添加新類 Shift + Alt + A = 添加新項目到項目 編輯相關的鍵盤快捷鍵 Ctrl + En ...
  • 在.net的項目開發中,經常會對XML文件進行操作,由於XML文件可以實現跨平臺傳輸,較多的應用在數據傳輸中,特總結以下幾種常用的XML操作方法: 1.創建XML文檔: 2.讀取XML文檔中的數據: 3.對XML文檔插入數據: 4.修改XML文檔中的數據: 5.刪除XML文檔中數據: 6.讀取XML ...
  • 1.什麼是ORM ORM的全稱是Object Relational Mapping,即對象關係映射。它的實現思想就是將關係資料庫中表的數據映射成為對象,以對象的形式展現,這樣開發人員就可以把對資料庫的操作轉化為對這些對象的操作。因此它的目的是為了方便開發人員以面向對象的思想來實現對資料庫的操作。 2 ...
  • 文章出處:http://www.cnblogs.com/gaoweipeng/archive/2009/05/17/1458762.html ...
  • 首先需要添加的命名空間 using System.Web.UI.WebControls;using System.Drawing.Drawing2D;using System.Drawing.Imaging; 編寫一個生成隨機數的方法,此方法很簡單,返回的是一個字元串也就是需要顯示到驗證碼中的字元串 ...
  • 當運行一個 Asp.Net Core 應用的時候, WebHostBuilder 根據環境變數來判斷當前運行的是哪個環境,可能是 Development,Staging或者Production.你也可以設置成隨便的一個字元串. 這個鏈接將會告訴你 如何在各種平臺各種環境中設置環境變數.但如果你使用 ...
  • 修飾符 訪問許可權 public 關鍵字是類型和類型成員的訪問修飾符。 公共訪問是允許的最高訪問級別。 對訪問公共成員沒有限制 private 私有訪問是允許的最低訪問級別。 私有成員只有在聲明它們的類和結構體中才是可訪問的 protected 受保護的,訪問許可權於包含類或包含類派生的類型 inter ...
  • 最初接觸時,感覺很好玩,然後就自己研究了下,做了個demo,然後整理下,下次可以直接使用啦,英文大小寫,點擊可以切換 上代碼了。。。。 頁面代碼: <img id="Img" src="/Login/GetCheckCode" /> 這個是頁面JQuery點擊更換方法 $("#Img").click ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...