C# 中枚舉的一點研究(跳過一些net坑的研究而已)

来源:http://www.cnblogs.com/span06/archive/2017/12/06/7993850.html
-Advertisement-
Play Games

之前一直使用Enum.Parse()將字元串轉為枚舉,沒有深究,後面發現一個問題後對下麵的Enum有了一個初步研究(.net 4.0).看下麵代碼. 首先定義一個test枚舉 結論,對於Enum.Parse() 方法,即使是想通過TryParse()方法判斷返回的bool值,也建議首先使用Enum. ...


之前一直使用Enum.Parse()將字元串轉為枚舉,沒有深究,後面發現一個問題後對下麵的Enum有了一個初步研究(.net 4.0).

枚舉是一個指定的常數集,其基礎類型可以是除 Char 外的任何整型。 如果沒有顯式聲明基礎類型,則使用 Int32。 Enum 是 .NET中所有枚舉的基類。

永遠不要創建基礎類型為非整形的枚舉類型。 雖然可以通過使用反射來創建這一枚舉類型,但使用得出的類型的方法調用是不可靠的,也可能會引發其他異常。

看下麵代碼.

(留意,枚舉類型是值類型,其值不能為Null,所以我們定義一個枚舉類型,其預設值通常為該枚舉的第一個元素,或值為0的元素)

首先定義一個test枚舉

enum test { aaa,bbb,ccc,ddd}

(1)現在對比Parse方法(留意,parse方法裡面value參數是區分大小寫的,如果想忽略大小寫,一定要使用帶ignoreCase參數的覆寫方法) private void button1_Click(object sender, EventArgs e) {
test te;
te = (test)Enum.Parse(typeof(test), "4"); //4
typeStr = te.GetType().Name; //test
    te = (test)Enum.Parse(typeof(test), "2"); //ccc
typeStr = te.GetType().Name; //test
    te = (test)Enum.Parse(typeof(test), "ddd"); //ddd
    te = (test)Enum.Parse(typeof(test), "ddd1"); //System.ArgumentException("未找到請求的值“ddd1”。")
}
那麼看看TryParse方法呢?
test te = test.bbb; 
//
(留意,TryParse方法未經初始化即被賦值為預設值,如果不想TryParse方法改變Out的枚舉值,先調用 IsDefined()(IsDefined對於字元串區分大小寫的)方法
//以確保整數的特定字元串表示形式實際是 TEnum 的成員。)
if (Enum.TryParse("aaa", out te)) //aaa    
 MessageBox.Show(te.GetType().Name); //test

if (Enum.TryParse("111", out te)) //111
    MessageBox.Show(te.GetType().Name);
TryParse方法定義
public static bool TryParse<TEnum>(
    string value,
    out TEnum result
)
where TEnum : struct
TryParse方法有點奇特,只要是value能轉換為數字,那麼一定會成功,如果不能,則根據大小寫(預設區分大小寫)去轉換.不存在就返回false.

結論,對於Enum.Parse() 方法,即使是想通過TryParse()方法判斷返回的bool值,也建議首先使用Enum.IsDefined()判斷是否存在.

 

(2)Enum.ToObject()方法

te = (test)Enum.ToObject(typeof(test), 4); //4
由此可見,ToObject()也同Parse方法一樣,對於數值,都不會引發ArgumentException,而轉換成功,所以也建議首先使用Enum.IsDefined()判斷是否存在.

(3)Enum.GetValues()方法

  這個方法並不能獲取結果為{0,1,2,3}的數組,而是返回和GetNames()方法一樣的,只不過GetNames返回值類型為string[].
如果想獲取{0,1,2,3},參考這個方法

public static Array getValuesArray(Type enumType)
{
    Array tempArry;
    tempArry = Enum.GetValues(enumType);
    //tempArry = enumType.GetEnumValues();
    Array result = Array.CreateInstance(typeof(int), tempArry.Length);
    int j = 0;
    foreach (int i in tempArry)
    {
        result.SetValue(i, j++);
    }
    return result;
 }
(4) 一直說用Enum.IsDefined()方法判斷是否存在,那麼還是看看這個方法吧.
bool b;
b = Enum.IsDefined(typeof(test), 3);//True
b = Enum.IsDefined(typeof(test), 4);//false
b = Enum.IsDefined(typeof(test), "aaa");//true
b = Enum.IsDefined(typeof(test), "aaA");//false
b = Enum.IsDefined(typeof(test), "aaA1");//false
(5)現在在看看Enum.GetName(Type enumType, Object value)
方法對於字元串和整形是怎麼樣處理的
string s;
s = Enum.GetName(typeof(test), 3);//ddd
s = Enum.GetName(typeof(test), 4);//null
//s = Enum.GetName(typeof(test), "3");//System.ArgumentException(傳入的值必須是枚舉的枚舉基或基礎類型,如 Int32)            
//s = Enum.GetName(typeof(test), "aaa");//System.ArgumentException(傳入的值必須是枚舉的枚舉基或基礎類型,如 Int32)
 
基於以上的總結,以後但凡是想將字元串或整形轉為枚舉,那麼首先用Enum.IsDefined()方法判斷,
對於字元串,用Parse或TryParse轉換,由於.net方法太多常見是不區分大小寫的,所以記得使用ignoreCase參數的覆寫方法.
對於整形,可以使用Parse和ToObject方法.
將整數轉換為枚舉值時,可以分配一個實際並非枚舉成員的值。 為防止該情況,可在執行轉換前將該整數傳遞至 IsDefined() 方法。
將枚舉轉為字元串或整形值,可使用可通過調用靜態 Format 方法以及重載實例 ToString()方法.或GetName().
Enum 類提供 IConvertible 介面的顯式介面實現以從枚舉值轉換為整數類型,所以可以使用Convert.ToInt32.
Convert.ToInt32(test.aaa);

如果想將枚舉元素或(值)轉為字元串(整形),可用Enum.GetValues用(int)轉換一下.

 


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

-Advertisement-
Play Games
更多相關文章
  • 創建類 實例化對象 form = 類名(instance=obj,data=request.POST) instance傳的是已有的對象(在頁面中顯示預設值)data傳的是從頁面返回過來的值(用戶輸入的值 ,用來驗證) form.is_valid() #驗證 form.save #將數據保存至資料庫 ...
  • 一、ModelForm的介紹 應用場景: - ModelForm - 中小型應用程式。因為ModelForm是依賴於models的 - Form - 大型應用程式 * 註意事項: 二、表結構 三、基於Form組件的添加和編輯 添加:這隻是單表的添加 編輯:單表的編輯 具體基於Form組件實現的一對多 ...
  • Modelform組件 Modelform就是model和from兩者結合起來的。它既有驗證,又有資料庫的操作 Modelform組件: Modelform註意事項: 1、類 示列(增刪改查): url: from django.conf.urls import url from django.co ...
  • 使用synchronized雖然能夠避免不同步的現象出現,但是也會出現弊端,比如代碼執行時間過長,那麼其他線程就必須等待該線程執行完畢釋放鎖之後才能拿到鎖。 面對這種問題可以使用同步代碼塊來解決。 2.2.1synchronized方法的弊端: 任務類: 工具類: 線程代碼1: 線程代碼2: 執行代 ...
  • 基類中的某個函數只與部分(並非全部)子類有關。將這個函數移到相關的那些子類去。 ...
  • 今天再學習一些C#的基礎知識,如對 Int Array進行排序:你可以在控制台應用程式中,創建一個類別,它屬性和2個構造函數: class Af { private int[] myVar; public int[] MyIntArray { get { return myVar; } set { ...
  • 第一種:ROW_NUMBER() OVER()方式 select * from ( select *, ROW_NUMBER() OVER(Order by ArtistId ) AS RowId from ArtistModels ) as b where RowId between 10 and ...
  • 一、簡介 之前也記錄過一篇關於把 HTML 文本或 HTML 文件轉換為 PDF 的博客,只是之前那種方法有些局限性。 後來又瞭解到 wkhtmltopdf.exe 這個工具,這個工具比起之前的那種方法簡直是太好用了。它是一個使用 Qt WebKit 引擎做渲染的,能夠把 HTML 文檔轉換成 PD ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...