懂得C#中的列舉(簡明易懂)。本站提示廣大學習愛好者:(懂得C#中的列舉(簡明易懂))文章只能為提供參考,不一定能成為您想要的結果。以下是懂得C#中的列舉(簡明易懂)正文
1、在進修列舉之前,起首來聽聽列舉的長處。
1、列舉可以或許使代碼加倍清楚,它許可應用描寫性的稱號表現整數值。
2、列舉使代碼更容易於保護,有助於確保給變量指定正當的、希冀的值。
3、列舉使代碼更容易輸出。
2、列舉解釋
1、簡略列舉
●列舉應用enum症結字來聲明,與類同級。列舉自己可以有潤飾符,但列舉的成員一直是公共的,不克不及有拜訪潤飾符。列舉自己的潤飾符僅能應用public和internal。
●列舉是值類型,隱式繼續自System.Enum,不克不及手動修正。System.Enum自己是援用類型,繼續自System.ValueType。
●列舉都是隱式密封的,不許可作為基類派生子類。
●列舉類型的列舉成員均為靜態,且默許為Int32類型。
●每一個列舉成員均具有相干聯的常數值。此值的類型就是列舉的底層數據類型。每一個列舉成員的常數值必需在該列舉的底層數據類型的規模以內。假如沒有明白指定底層數據類型則默許的數據類型是int類型。
●列舉成員不克不及雷同,但列舉的值可以雷同。
●列舉最初一個成員的逗號和年夜括號前面的分號可以省略
C#供給類一個類來便利操作列舉,上面給出這個類的經常使用辦法:
要顯示指定列舉的底層數據類型很簡略,只需在聲明列舉的時刻加個冒號,前面緊跟要指定的數據類型。
enum sex : byte //顯示指定列舉的底層數據類型
{
male,
female, //此逗號可以省略
}; //此分號可以省略'
顯式設置列舉的成員常量值,默許是從0開端,逐一遞增的。然則以下例子卻設置成了1,2,3,4,5,6,7,0。並且成員值可以一樣的。
enum Week
{
Monday = 1,
Tuesday = 2,
Wednesday = 3,
Sunday = 0,
Everyday = 1 //成員的值可以設置成一樣的,然則成員不可
}
Console.WriteLine((int)Week.Monday); //獲得值
示例,由列舉值獲得列舉稱號與由列舉稱號獲得列舉值
class Program
{
static void Main(string[] args)
{
Console.WriteLine(Enum.GetName(typeof(Man),1)); //照樣 劉備 (由值獲得名字)
string[] array1 = Enum.GetNames(typeof(Man));
Console.WriteLine(array1[1]); //關羽
Array array2 = Enum.GetValues(typeof(Man));
Console.WriteLine(array2.GetValue(1)); //照樣關羽
Type t = Enum.GetUnderlyingType(typeof(Man));
Console.WriteLine(t); //輸入 Int32
//由值獲得內容
int i = 1;
string Name = Enum.Parse(typeof(Man), i.ToString()).ToString(); //此時 Name="劉備"
Console.WriteLine(Name);
//由值獲得內容
string Name2 = "關羽";
int j = Convert.ToInt32(Enum.Parse(typeof(Man), Name2)); //此時 j=2
Console.WriteLine(j);
Console.ReadKey();
}
}
enum Man
{
劉備 = 1,
關羽 = 2,
張飛 = 3
}
2、標記列舉
標記列舉要在頂部加[System.Flags]特征停止聲明。並且列舉支撐組合運算。先來看個例子
class Program
{
static void Main(string[] args)
{
var man = Week.白 | Week.美; //賦值為101 盤算辦法001或上100,成果是101
Console.WriteLine((int)man);
if ((man & Week.白) == Week.白) //101 man
{ //001 白 逐位相與,
Console.WriteLine("這人白"); //001 假如成果是白,便可以反推出man包括 白
}
else
{
Console.WriteLine("這人黑");
}
Console.ReadKey();
}
}
[System.Flags]
public enum Week
{
白 = 1, //001
富 = 2, //010
美 = 4, //100
}
這類位運算長短常有效的,在sql語句裡也支撐位運算。也就是說,把一個列舉運算後的成果存入數據庫以後,還可以或許依照你的請求讀掏出來。好比:
將一個"白美"存如數據庫的值存入數據庫,那末存入去的就是整型5。
那末我想讀出一切的"白"數據列表怎樣讀呢?白,可所以純白"1",也是是白富3,可所以白美5,也能夠是白富美7,你可以用in來讀,然則更好的辦法是在sql語句中異樣應用位運算。
select * from Table1 where Tag & 1 = 1 //Tag是列名
select * from Table1 where Tag | 1 = Tag
3、列舉的應用建議
當參數、前往值、變量等類型可使列舉,盡可能應用列舉(要留意斟酌分類的穩固性)
年夜多半情形下都可使用int類型列舉,以下情形除外。
列舉能夠被年夜量頻仍的應用,這時候為了勤儉空間可使用小於int類型的列舉。
標記列舉,且標記多於32個。
上面寫一個:列舉綁定MVC3下拉列表的示例:
掌握器代碼:
namespace MvcStart.Controllers
{
public class HomeController : Controller
{
public ActionResult GetSexList()
{
Dictionary<string, int> Sexlist = new Dictionary<string, int>();
string[] keys = Enum.GetNames(typeof(sex));
Array values = Enum.GetValues(typeof(sex));
for (int i = 0; i < keys.Length; i++)
{
Sexlist.Add(keys[i], (int)values.GetValue(i));
}
return View(Sexlist);
}
}
public enum sex
{
male = 1,
female = 2,
other = 3
}
}
視圖代碼:
@model Dictionary<string, int>
<select>
@foreach(var item in @Model)
{
<option value="@item.Value">@item.Key</option>
}
</select>
生成的HTML代碼:
<select>
<option value="1">male</option>
<option value="2">female</option>
<option value="3">other</option>
</select>
再來一個例子,獲得列舉描寫
public static class GetDescription
{
/// <summary>
/// 獲得描寫信息
/// </summary>
/// <param name="en"></param>
/// <returns></returns>
public static string description(this Enum en)
{
Type type = en.GetType();
MemberInfo[] memInfo = type.GetMember(en.ToString());
if (memInfo != null && memInfo.Length > 0)
{
object[] attrs = memInfo[0].GetCustomAttributes(typeof(System.ComponentModel.DescriptionAttribute), false);
if (attrs != null && attrs.Length > 0)
return ((DescriptionAttribute)attrs[0]).Description;
}
return en.ToString();
}
}
public enum Sex
{
[Description("男")]
man = 1,
[Description("女")]
woman = 2,
[Description("其他")]
other = 3
}