2008年11月24日星期一

C# 認識Enumeration - enum Keyword

Enumeration(列舉型別)不是常用的類型,不過有時候做對比的程序,Enum就起了作用。自己寫程式都是比較少用Enum,所以溫故知新,在此講解一下Enum的用法。

找一個例子,假如你替一間遊戲店寫一個系統,需要做以下功能:
- 由產品名稱找到售價
- 由售價找到產品名稱
- 由售價去判斷產品是否存在
那Enum列舉型別都大派上場了。

首先我們簡單地了解一下如何 Construct Enum :
開一個新的Windows Form :
namespace Enum_Example_1
{
enum GameConsole
{
XBox360,
PS3,
Wii,
NDSL,
PSP
};

public partial class Form1 : Form
{
public Form1()
{ InitializeComponent();}

private void Form1_Load(object sender, EventArgs e)
{
GameConsole IHaveThisConsole = GameConsole.XBox360;
Console.WriteLine((IHaveThisConsole == GameConsole.PS3).ToString()); //False
Console.WriteLine((IHaveThisConsole == GameConsole.XBox360).ToString()); //True
}
}
}

在這裡我們可以看到Enum本身就有對比性,即使你不預設任何Value,但是enum類型本身就是可以分別是否相同。


再來,我們在Form1_Load的程序中,加入
int x = (int)GameConsole.XBox360;
Console.WriteLine(x.ToString()); //Output 0

此時,可以你會問,為什麼會輸出 0 呢? 因為根據enum預設,第一個列舉值的值是 0,而每一個接下來的列舉值會遞增 1。如上面的例子,XBox360=0, PS3=1,Wii=2 ...如此類推。而enum可以自訂類型,enum 的核准型別為 byte、sbyte、short、ushort、int、uint、long 或 ulong。

假如你要設定為long的話,語法如下 :
enum GameConsole : long
{
XBox360,
PS3,
Wii,
NDSL,
PSP
};

當然我們亦可以預設enum成員的數值 (假如數值是遊戲機的售價):
enum GameConsole
{
XBox360 = 2400,
PS3 = 2600,
Wii = 2200,
NDSL = 1400,
PSP = 1200
};

那現在我們一次過進行產品名稱和售價的反覆對比,在Comment中講解一下,完全Program Code如下:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace Enum_Example_1
{
// Construct enum
enum GameConsole
{
XBox360 = 2400,
PS3 = 2600,
Wii = 2200,
NDSL = 1400,
PSP = 1200
};

public partial class Form1 : Form
{
public Form1()
{ InitializeComponent();}

private void Form1_Load(object sender, EventArgs e)
{
GameConsole IHaveThisConsole = GameConsole.XBox360;
Console.WriteLine((IHaveThisConsole == GameConsole.PS3).ToString()); //False
Console.WriteLine((IHaveThisConsole == GameConsole.XBox360).ToString()); //True

//Find Xbox360 Price
int x = (int)GameConsole.XBox360;
Console.WriteLine(x.ToString()); //Output 2400

string price_1 = "1400";
GameConsole C = (GameConsole)Enum.Parse(typeof(GameConsole), price_1);
Console.WriteLine(C.ToString()); //Found NDSL

string price_2 = "1234";
GameConsole C2 = (GameConsole)Enum.Parse(typeof(GameConsole), price_2);
Console.WriteLine(C2.ToString()); //Nothing , output 1234

//Alternate method
string s = Enum.GetName(typeof(GameConsole), 1200);
Console.WriteLine(s); // Found PSP

try
{
string product_name = "GameBoy";
GameConsole C3 = (GameConsole)Enum.Parse(typeof(GameConsole), product_name); //Nothing Found And throw Exception
}
catch (Exception ex)
{ Console.WriteLine(ex.ToString()); } //exception 

}
}

}

看到這裡,你的腦袋應該有點發熱,或者曾幾何時你使用多過一個ArrayList或List進行比對程序。或者你亦設置過一個 Multi-Dimension 的Array,String去找Index,再找Value。但某些情況下,都可以用建構Emun型別做參照的。

沒有留言:

發佈留言