C#基礎列舉型別
12.1 列舉型別
列舉型別基實就是一些常量和一個例項欄位。
強型別,列舉之間進行不能隱式轉換
列舉型別直接派生於System.Enum,後者派生於System.ValueType,值型別,可以使用裝箱/拆箱
不能定義方法/屬性/事件。
同一個列舉中,多個列舉符號有相同的數值,數值轉符號時,會返回其中第一個符號。(注意理解)
列舉型別要與使用它的類在同一級。
預設為int,可以指定列舉成員的型別,只有int,uint,byte,sbyte,long,ulong,short,ushort這8種基元型別。
可以使用操作符作用於列舉型別,實際上是作用於相應的value例項欄位,如++。
可以將列舉型別的例項顯示轉型為另一個不同的列舉型別,其實是先轉為值,再反過去在另一個列舉中根據值找對應列舉值。
可以顯示將列舉型別的例項轉型為一個數值型別。
public enum Color
{
Red,
Black,
White
}
public enum Sentence
{
hello,
bye
}
class Program
{
{
//使用運算子,++
Color a = Color.Red;
++a;
Sentence s;
//兩個不同的列舉相互轉換, 但是發現Color.White值為2,相應在Sentence中找不到,所以直接返回整數2
s = (Sentence)Color.White; //等價於(Sentence)1;
//兩個不同的列舉相互轉換,返回列舉值Black
s = (Sentence)Color.Black;
//直接輸出White列舉值, 顯式轉為整數
Console.WriteLine(Color.White); //輸出white
Console.WriteLine((Int32)Color.White); //輸出2
}
}
如 enum Color{Red=1, White=2}對應IL:
可以看到,列舉只是一個在其中定義一系列常量欄位和例項欄位的結構。
如果只使用Color.Red這樣的型別,則會作為常量處理,從而程式碼不再引用定義了的列舉型別,可以刪除相應的dll(具體見第7章);
如果使用Color c = new Color();這樣的語法,那麼依賴於引用,不可以刪除相應的dll
列舉方法列表:
1.GetUnderlyingType靜態方法,獲取列舉型別值的核心型別:
//返回System.Int
Enum.GetUnderlyingType(typeof(Color));
2.ToString()方法
Color c = Color.Black;
Console.WriteLine(c); //輸出Black
Console.WriteLine(c.ToString()); //輸出Black
Console.WriteLine(c.ToString("G")); //輸出Black,以上都是泛型格式
Console.WriteLine(c.ToString("D")); //輸出1,十進位制
Console.WriteLine(c.ToString("X")); //輸出00000001,十六進位制
對於c.ToString("X")十六進位制格式,A-F始終是大寫字母。此外,輸出的數位個數取決於Color的基本型別:
byte/sbyte 2位
short/ushort 4位
int/uint 8位
long/ulong 16位
3.Format靜態方法,功能基本同ToString()方法,但允許value傳遞一個數值,而不僅僅是一個Enum型別
Enum.Format(typeof(Color), 3, "G");
4.GetValues靜態方法,返回一個數組,陣列中為所有的列舉型別名稱:
Color[] colors = (Color[])Enum.GetValues(typeof(Color));
5.static String GetName(Type enumType, Objbect value)靜態方法,返回數值的字串表示
6.static String[] GetNames(Type enumType),返回方法5的陣列表示
7.Parse靜態方法,將一個符號轉換為列舉型別的一個例項:
Color cc1 = (Color)Enum.Parse(typeof(Color), "2");
Color cc2 = (Color)Enum.Parse(typeof(Color), "Black"); //可以是值,也可以是列舉型別名稱
Color cc3 = (Color)Enum.Parse(typeof(Color), "Black", true); //可選引數true表示忽略大小寫
8.IsDefined靜態方法,判斷一個數值對於一個列舉型別是否合法:
Enum.IsDefined(typeof(Color), 10); //返回false,Color中沒有10
Enum.IsDefined(typeof(Color), "Black"); //返回true
常用於引數驗證:
public void SetColor(Color c)
{
if (!Enum.IsDefined(typeof(Color), c))
{
//丟擲異常,c不適合Color
}
}
注:Enum.IsDefined方法慎用,因為要區分大小寫查詢;使用反射機制,速度慢。
9.ToObject靜態方法,一系列方法,如Enum.ToObject (Type, Byte),將Int32,Byte等型別例項轉為列舉型別的例項(由於返回都是Object,所以要顯示轉型)
12.2 位標誌 bit flag
位標誌是一個位集合,其中有些位on,有些位off;而列舉是一個數值,是位集合中若干值的累加。
在列舉上應用[Flags]屬性,就可以用列舉來表示一組可以組合的位標誌,一般要定義一個值為0的None符號。
[Flags]
public enum FileAttributes
{
ReadOnly = 0x0001,
Hidden = 0x0002,
System = 0x0004
}
這時,就可以使用位運算來操作:
邏輯與,判斷是否有這個列舉值
//以下程式碼,先取出檔案的屬性列表——是一個位集合,
//與FileAttributes.Hidden做邏輯:如果位集合中有FileAttributes.Hidden,則返回FileAttributes.Hidden
String file = @"C:\Boot.ini";
FileAttributes attributes = File.GetAttributes(file);
if ((attributes & FileAttributes.Hidden) == FileAttributes.Hidden) { }
邏輯或,組合出所需的列舉列表,一般用來設定:
File.SetAttributes(path, FileAttributes.ReadOnly | FileAttributes.Hidden);
對位標記Enum呼叫ToString()方法,數值轉字串:
先檢查是否應用了[Flags]屬性
如果沒有,就查詢與該數值匹配的Enum符號並返回,沒有匹配就返回數值。
如果有,就獲取Enum降序排列的數值集合A,將A中的數值“按位與”Enum例項中的數值,將結果等於數值的Enum項附加到輸出字串,以逗號分割,如"Read,Write"
有兩種特殊情況:
1.一個數值不能由Enum的若干項組合,則返回該數值
2.應該定義0。
對位標記Enum呼叫Parse()方法,字串轉數值:
Enum.Parse(typeof(Color), "Query");
Enum.Parse(typeof(Color), "Query, Read");
Enum.Parse(typeof(Color), "28");
處理過程如下:
1.刪除字串中所有空白字元
2.如果字串以+/-/數字開始,那麼字串被認為是一個數字,直接轉型為對應數值的字串
3.以逗號分割字串,在Enum中查詢相應符號的數值,按位或取值並返回
不要對位標記Enum呼叫IsDefined()方法,因為,
傳字串,位標記中含有逗號,但永遠找不到含有逗號的列舉符號;
傳數值,永遠返回false
第十三章 列舉型別與位標記
一、 列舉型別
1、 使用列舉型別的理由:
l 列舉型別是得程式更容易編寫、閱讀、維護,在程式碼中使用符號名稱代替數字是程式設計的一貫主張。
2 強型別的,便於型別檢驗
2、 注意事項:
1枚舉型別繼承自System.Enum,System.Enum又繼承自System.ValurType
2列舉型別不能定義方法、屬性、事件
3列舉型別為常數而非只讀欄位,因此可能引入版本問題(見第八章的相關討論)
4 將列舉型別與引用它的型別定義在同一層次上,可減少程式碼錄入的工作量
3、 System.Enum中方法的應用:
l public static Type GetUnderlyingType(Type enumType);
獲取用於儲存列舉型別例項值得基礎型別。宣告某列舉型別使用的基礎型別語法如下:
enum Human : byte
{
Male,
Female
}
則呼叫上述方法Enum.GetUnderlyingType(typeof(Human));將返回System.Byte;
2 public override string ToString();
public string ToString(string); //引數為格式字串
public static string Format(Type enumType,object value,string format);
//Value – 要轉換的值,format – 格式字串(G,g,X,x,D,d,F,f)
3 public static Array GetValues(Type enumType);
獲取列舉中常數值的陣列
l public static string GetName(Type enumType,object value);
在指定列舉中檢索具有指定值的常數的名稱
4 public static string[] GetNames(Type enumType);
檢索指定列舉中常數名稱的陣列。
l public static object Parse(Type, string);
public static object Parse(Type, string, bool);
將一個或多個列舉常數的名稱或數字值的字串表示轉換成等效的列舉物件
l public static bool IsDefined(Type enumType,object value);
返回指定列舉中是否存在具有指定值的常數的指示,value為常數的值或名稱
l 系列ToObject方法
返回設定為指定值的、指定列舉型別的例項
using System;
public enum Color
{
Red,
Black,
White
}
相關推薦
C#基礎列舉型別
12.1 列舉型別 列舉型別基實就是一些常量和一個例項欄位。 強型別,列舉之間進行不能隱式轉換 列舉型別直接派生於System.Enum,後者派生於System.ValueType,值型別,可以使用裝箱/拆箱 不能定義方法/屬性/事件。
C++基礎-string型別-操作符
操作符 == // 關係操作符,從兩個字串的首字元根據字元的ASCII值開始比較 > < >= <= != + //s1 + s2,把 s1 和 s2 連線成一個新字串, 返回新生成的字串 += // s1 += s
C++基礎-string型別-建構函式
建構函式 string(); // 預設建立一個空字串 string( size_type length, char ch );// 建立length個字元ch的字串 string( const char *str );//建立str的一個副本字串 string( cons
JAVA19基礎-列舉型別
列舉型別 一.對比兩種方法 利用 public static final 定義常量 public class Light { public static final int RED=1; public static final int GREEN=2; public sta
19-C++基礎-char型別:字元與小整數
[cpp] view plain copy print?//morechat.cpp——the char type and int type contrasted#include<iostream>usingnamespace std; int main() { char ch='M
C#基礎資料型別與位元組陣列(記憶體中的資料格式)相互轉換(BitConverter 類)
在某種通訊協議中(如 Modbus),可能需要把一些基本的資料型別記憶體中的表示形式轉換成以位元組陣列的形式,方便傳送。C/C++中可以利用指標等操作完成,但C#中沒有指標,咋辦呢?可以用BitConverter類啊。 1,把double型別轉換成byte陣列,float型別的話,在1234.5678後加
C/C++enum列舉型別及賦值範圍
C++的enum工具提供了一種建立符號常量的方式,這種方式可以代替const 1.建立enum列舉 這語句完成工作:1.讓weekday成為新型別的名稱,2.讓sun、mod、tue等作為符號常量,它們對應整數值0~
C++基礎——非型別模板引數
非型別模板參看,顧名思義,模板引數不限定於型別,普通值也可作為模板引數。在基於型別的模板中,模板例項化時所依賴的是某一型別的模板引數,你定義了一些模板引數(template<typename T>)未加確定的程式碼,直到模板被例項化這些引
C/C++基礎----特殊工具和技術 (過載new和delete,RTT,限定作用域的列舉型別,類成員指標,巢狀類,區域性類,volatile,連結指示 extern “C”)
過載new和delete 1呼叫operator new( 或new[])標準庫函式分配足夠大的、原始的、未命名的記憶體空間以便儲存特定型別的物件 2編譯器執行相應地建構函式以構造這些物件,併為其傳入初始值 3返回一個指向該物件的指標 可以在全域性作用域定義operator new,也可以定義為成員函式
C#基礎 Enum 輸出列舉型別的數值和名稱
慈心積善融學習,技術願為有情學。善心速造多好事,前人栽樹後乘涼。我今於此寫經驗,願見文者得啟發。 .NET Framework : 4.7.2 IDE : Visual Stud
Java的識別符號與資料型別——有C++基礎的Java入門(二)
目錄 一、 識別符號 1、 概念 2、 識別符號的規範 (1) 類和介面 (2) 變數和方法 (3) 常量 二、 資料型別 1、 資料型別定義及預設值 2、資料型別自動轉換 (1) 總結 (2) 與C++的不同點 (3) 原理 3、 強制轉換
【C#基礎】輸入一個字元,判定它是什麼型別的字元(大寫字母,小寫字母,數字或者其它字元)
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace _02_判斷使用者輸入字元型別 { c
C++基礎學習之複合型別(2)
複合型別 陣列 字串 string類 結構 共用體 列舉 指標(new delete管理動態記憶體) 動態陣列,動態結構 vector和array類 1.陣列 陣列宣告格式: typeName arrayName[ar
c++基礎:const,變數的作用域和生存期,儲存型別
一:const的使用: const常量型別表示“常值變數”,cosnt型變數代表的常值只在其作用域內有效; const與define相比:const會在編譯時進行型別檢查,而define只做文字替換;define後面不需要分號。 1.宣告變數:例如 const int size = 20; 2.限定
C語言之列舉型別
在C語言中,列舉型別(enumerated type)宣告符號名稱來表示整形常量。使用enum關鍵字,可以建立一個新“型別”並指定它可具有的值,如: //建立spectrum作標記名,那enum spectrum作為一個型別名使用 enum spectrum { red, orange,
C語言(結構體、列舉型別、型別定義)
結構體的定義 1、`struct 結構體名 { 成員型別 成員名; … }; 2、省略結構體名 struct { 成員型別 成員名; ... }結構體變數名; 成員可以是其他已定義結構體的型別,但不能是自己結構體的型別,可以是自己結構體的指標。 定義
Cocos2dx 3.0 過渡篇(二十八)C++11強型別列舉
一朋友在微信朋友圈晒了張照片,隨手點開大圖,帶著讚賞的眼光掃了下,恩,幾個月不見。又美麗了...咦?等等,她戴的這是什麼? 酷炫的造型!金屬邊框!微型攝像頭! 這不是傳說中的谷歌眼鏡麼?土豪啊,還好我們已經是朋友了...我先給了她一個贊,然後直奔主題,霸氣回覆道:我過幾天去找你,你
C++列舉型別Enum及C++11強列舉型別用法
列舉常常和switch配合使用,用一個程式碼片段來說明: //W A S D 前、後、左、右行走\nQ E 左、右轉頭\nF 復位\nG H 暫停、繼續、重播例項\nY 停止例項\nB 刪除例項\nSPACE 刪除所有例項 enum Keydown{ Forward='w', Back
C++基礎回顧1——資料型別,變數型別、儲存
最近找工作沒有好好還準備code,結果被問了很多基礎知識都不會,所以這裡要來回顧一下。 大家找工作一定要提前準備啊,好好刷題。 ————————————————————————————————————————————————————————— C++ 是一種靜態型別的、
C#,基礎資料型別,變數,常量
1.C#是什麼? C#是微軟公司推出的一種語法簡潔,型別安全的面向物件的程式語言。開發人員可以通過它編寫在.NET Framework 上執行的各種安全可靠的應用程式。能夠開發桌面應用程式以及WEB程式。 C#的基礎資料型別 資料型別