先前與朋友討論程式語言的時候,總發現學校似乎特別少提到列舉(enum)的用法,事實上,在實務上這是提高程式可讀性的一個很好的方法。本篇就如何使用enum做一些討論。
筆者學生時期曾撰寫貪吃蛇,依稀還記得當年尚未了結何謂enum,於是有了下列定義:
private int direction; //0:上 1:下 2:左 3:右
然後在移動的function中如下:
public void move()
{
switch (direction)
{
case 0://上
y++;
break;
case 1://下
y--;
break;
case 2://左
x++;
break;
case 3://右
x--;
break;
}
}
為了避免自己混淆,都會在0 1 2 3後面備註這是甚麼的定義。但這只是最簡單的案例。隨著筆者不斷學習,開始寫比較大型的程式的時候,往往定義到後面根本搞不清楚,或者忘記更新,最糟糕的是拜複製/貼上大法所賜,忘記改值,於是陷入DEBUG的深遠。知道知道enum的用法以後,就深深的愛上這個功能。
public enum eGameMode{
EASY,
NORMAL,
HARD,
}
如上程式碼是一個典型的enum定義。實際上,enum經過組譯後會成為uint的型態儲存於記憶體中。而定義好的enum,增加了許多可讀性。這是enum最大的作用!!
另外,C#中enum還可以直接指定值、另設別名(alias)的功能,如下程式碼:
public enum eAction
{
START = 6, //直接定義該值等於6
STOP, //下一筆則自動被+1 設定為7
RUN = START, //RUN 其實和START 一樣也是6。
}
筆者利用該功能增加上述經典程式碼的可讀性,如下:
public enum eDirection
{
UP,
DOWN,
LEFT,
RIGHT,
}
public void move()
{
switch (direction)
{
case eDirection.UP:
y++;
break;
case eDirection.DOWN:
y--;
break;
case eDirection.LEFT:
x++;
break;
case eDirection.RIGHT:
x--;
break;
}
}
事實上,筆者實務上還經常將enum當Flag來使用,詳細的說明將在另外一篇中於各位說明。