2013年12月31日 星期二

C# String的@使用方法和代表意義

C#在字串處理上,有非常好用的功能,其中一種就是可以在字串前加上@,筆者就來簡單介紹這@所代表的意義。

C# 字串前的 @ 代表把字串中的 '\' 當成一般字元處理:

string a="abc\"dd"; //以 \" 表示雙引號。
string b= "C:\\Program Files\\";  //以 \\ 表示反斜線。

在字串前加@,撰寫和閱讀起來更容易:
string d = @"C:\Program Files\"; //加了@, 只需要寫一個反斜線即可。
string e = @"""C:\Program Files\"""; //加了@, 用"" 二個雙引號來表示一個雙引號。

@也可以像是php, perl中常用的here doc的寫法:

string ex = @"這裡是 string 的 heredoc範例
         歡迎來到開發者的異想世界
歡迎相互交流";

要將值寫入其中時,必須要以{數字}的方式呈現,如同以下例子:

string ex = @"你好 {0},

這是 {1} String的基礎";

string res = String.Format(ex, "David", "C#");

-雲遊山水為知已逍遙一生而忘齡- 電腦神手

2013年12月30日 星期一

Visual Studio C# Application Screen Design 應用程式畫面設計

應用程式畫面設計,是一門很有趣但很基礎的技術,在早期微軟第一代Visual Studio的推出,就開始了視覺化IDE的開發,讓開發者不用再另寫程式,隨手一拉,就可以完成非常簡單的畫面呈現。

Java的GUI界面,大致上是以 AWT 和 Swing 為主,而C#就是Windows Form和Windows Presentation Foundation。以外觀來說,通常會採用的是Java的Swing,C#的WPF,Java可以透過NetBeans拉出視窗畫面,同樣C#可以透過Visual Studio拉出視窗畫面。

要開發第一個應用程式,一開始新增C# WPF的空白專案,之後就可以透過Toolbox拉出要的Object物件。




TextBox用來顯示輸入資訊、Button處理互動和Label輸出結果。



接著再透過屬性 (Properties) 視窗調整物件的細部樣式,透過屬性 (Properties) 視窗修改該物件名稱,通常會採用駝峰式大小寫命名規則。



當畫面產生好了之後,接著請在處理互動的 Button 物件上按兩下左鍵,就可以開始進行程式的撰寫,讓使用者達到互動的效果。


簡單互動操作的程式碼:

lblResult.Content = txtInformation.Text;

txtInformation 代表 TextBox 輸入框物件的名稱,.Text 代表標籤物件的輸出結果。
btnInteractive 代表 Button 互動按扭物件的名稱。
lblResult 代表 Label 標籤物件的名稱,.Content 代表輸入框物件的輸入資訊。



簡單來說,每個物件都有許多相關的屬性可以透過程式設定,只要打入物件的名稱後,再打入 . (點) 就可以列舉出所有可以設定或取得的屬性,若寫在等號的左邊就是設定,若寫在等號的右邊就是取得。

接著按鍵盤上的 F5 鈕,或者Start按扭,即可執行應用程式,此時在TextBox輸入框輸入資訊,按下Button處理互動按鈕後,就會透過Label標籤產生出結果。

-雲遊山水為知已逍遙一生而忘齡- 電腦神手

2013年12月29日 星期日

C# Arrays 陣列

陣列是經過排序且資料型別相同的項目集合,可使用陣列名稱搭配所需項目從陣列起始處開始計算的位移來存取陣列。C# 和 Java 在陣列宣告方式以及陣列用法上有著一些重大差異。

一維陣列
一維陣列以線性方式儲存固定數目的項目,任一個項目只需要單一索引值來識別。在 C# 中,陣列宣告中的方括弧必須緊接在資料型別之後,但不能放置在變數名稱之後 ,但這點在 Java 中是允許的。因此,integers 型別的陣列使用以下語法來宣告:
int[] arr1;


下列宣告在 C# 中是無效的:
//int arr2[];  //compile error


宣告陣列之後,就可以使用 new 關鍵字來設定陣列的大小,這和在 Java 中相同。下列程式碼宣告陣列參考:
int[] arr;
arr = new int[5];  // create a 5 element integer array


接著使用與 Java 完全相同的語法來存取一維陣列中的項目。C# 的陣列索引也是以零起始。下列程式碼會存取先前陣列的最後一個項目:

System.Console.WriteLine(arr[4]);  // access the 5th element


初始化
C# 陣列項目在建立時可以使用與 Java 完全相同的語法來初始化:
int[] arr2Lines;
arr2Lines = new int[5] {1, 2, 3, 4, 5};


C# 與 Java 不同的是,C# 的初始設定式數目必須剛好符合陣列的大小。可以使用這個功能,在同一行中宣告並初始化 C# 陣列:
int[] arr1Line = {1, 2, 3, 4, 5};


這個語法會建立和初始設定式數目相同大小的陣列。
在程式迴圈中初始化
在 C# 中初始化陣列的另一個方法是使用 for 迴圈。下列迴圈會將陣列中的每個項目設為零:

int[] TaxRates = new int[5];

for (int i=0; i<TaxRates.Length; i++)
{
    TaxRates[i] = 0;
}


不規則陣列
C# 和 Java 都支援建立不規則或非矩形的陣列,此陣列中的每一列都包含不同數目的行。例如,下列不規則陣列的第一列中有四個項目,第二列中則有三個:
C#
int[][] jaggedArray = new int[2][];
jaggedArray[0] = new int[4];
jaggedArray[1] = new int[3];


多維陣列
利用 C#,可建立規則的多維陣列,它就像是具有相同型別的值矩陣。Java 和 C# 同時支援不規則陣列,但 C# 還另外支援多維陣列或陣列的陣列。多維陣列可以用在非常多的地方,如地圖標示。
請使用下列語法宣告多維矩形陣列:
int[,] arr2D;      // declare the array reference
float[,,,] arr4D;  // declare the array reference


一旦宣告後,會依下列所示配置記憶體給陣列:
arr2D = new int[5,4];  // allocate space for 5 x 4 integers


接著,陣列的項目可利用下列語法來存取:
arr2D[4,3] = 906;


由於陣列是以零起始,此行會將位於第四列第五行的項目設為 906。
初始化
利用下列任一方法即可在單一陳述式中建立、設定和初始化多維陣列:
int[,] arr4 = new int [2,3] { {1,2,3}, {4,5,6} };
int[,] arr5 = new int [,]   { {1,2,3}, {4,5,6} };
int[,] arr6 =               { {1,2,3}, {4,5,6} };


在程式迴圈中初始化
陣列的所有項目可使用巢狀迴圈來加以初始化,如下所示:
int[,] arr7 = new int[5,4];

for(int i=0; i<5; i++)
{
    for(int j=0; i<4; j++)
    {
        arr7[i,j] = 0;  // initialize each element to zero
    }
}


System.Array 類別
在 .NET Framework 中,陣列是實作為 Array 類別的執行個體。這個類別提供了數個實用的方法,例如 Sort 和 Reverse。
下列的範例說明了這些方法很容易使用。首先,使用 Reverse 方法反轉陣列項目,然後再利用 Sort 方法來排序這些項目:

class ArrayMethods
{
    static void Main()
    {
        // Create a string array of size 5:
        string[] employeeNames = new string[5];

        // Read 5 employee names from user:
        System.Console.WriteLine("Enter five employee names:");
        for(int i=0; i<employeeNames.Length; i++)
        {
            employeeNames[i]= System.Console.ReadLine();
        }

        // Print the array in original order:
        System.Console.WriteLine("\nArray in Original Order:");
        foreach(string employeeName in employeeNames)
        {
            System.Console.Write("{0}  ", employeeName);
        }

        // Reverse the array:
        System.Array.Reverse(employeeNames);

        // Print the array in reverse order:
        System.Console.WriteLine("\n\nArray in Reverse Order:");
        foreach(string employeeName in employeeNames)
        {
            System.Console.Write("{0}  ", employeeName);
        }

        // Sort the array:
        System.Array.Sort(employeeNames);

        //  Print the array in sorted order:
        System.Console.WriteLine("\n\nArray in Sorted Order:");
        foreach(string employeeName in employeeNames)
        {
            System.Console.Write("{0}  ", employeeName);
        }
    }
}

-雲遊山水為知已逍遙一生而忘齡- 電腦神手

2013年12月28日 星期六

C# Looping Statements 迴圈陳述式

迴圈陳述式是程式裡很常使用的一個技巧,用於要在重覆大量動作的機制上,本文就來分享一些基本的程式技巧,大致上分為四種方式,用Java的語法和C#來做一個迴圈陳述式的比較。

迴圈陳述式會重複指定的程式碼區塊,直到滿足特定條件為止。

for 迴圈在 C# 和 Java 中的語法與操作完全相同:

for (int i = 0; i<=9; i++)
{
    System.Console.WriteLine(i);

}

在下列範例中,會將 int i 值寫入主控台,而且每次經過迴圈時,i 就會遞增 1。
class ForLoopTest
{
    static void Main()
    {
        for (int i = 1; i <= 5; i++)
        {
            Console.WriteLine(i);
        }
    }

}

foreach 迴圈
C# 引進了新的迴圈類型,稱為 foreach 迴圈,此迴圈與 Visual Basic 的 For Each 相似。foreach 迴圈可以逐一查看支援 IEnumerable 介面之容器類別 (例如陣列) 中的每個項目。下列程式碼將說明如何使用 foreach 陳述式輸出陣列內容:

static void Main()
{
    string[] arr = new string[] { "Jan", "Feb", "Mar" };

    foreach (string s in arr)
    {
        System.Console.WriteLine(s);
    }

}

在這個範例中,foreach 是用來顯示整數陣列的內容。
class ForEachTest
{
    static void Main(string[] args)
    {
        int[] fibarray = new int[] { 0, 1, 2, 3, 5, 8, 13 };
   
        foreach (int i in fibarray)
        {
            System.Console.WriteLine(i);
        }
    }

}


如需詳細資訊,請參閱陣列 (C# 與 Java 的比較)。

while 和 do...while 陳述式在兩種程式語言中的語法和操作完全相同:

while (condition)
{
    // statements

}

while 陳述式會重複執行陳述式或陳述式區塊,直到指定的運算式評估為 false 為止。
class WhileTest
{
    static void Main()
    {
        int n = 1;

        while (n < 6)
        {

            Console.WriteLine("Current value of n is {0}", n);
            n++;
        }
    }
}

do
{
    // statements
}

while(condition)

在下列範例中,只要變數 x 小於 5,就會執行 do-while 迴圈陳述式。
public class TestDoWhile
{

    public static void Main()
    {
        int x = 0;
        do
        {

            Console.WriteLine(x);
            x++;
        } while (x < 5);
    }

}


-雲遊山水為知已逍遙一生而忘齡- 電腦神手

2013年12月27日 星期五

C#、C/C++、Java

 C#(C Sharp)是微軟(Microsoft)為.NET Framework量身訂做的程式語言,C#擁有C/C++的強大功能以及Visual Basic簡易使用的特性,是第一個元件導向(Component-oriented)的程式語言,和C++與Java一樣亦為物件導向(object-oriented)程式語言。

 
以下是三種語言的特性分析:

功能
C++
Java
C#
   Platform Independence
   Garbage Collection
   Type Safety
   Scalability
(透過package來實踐)
(透過namespace來實踐)
   Pointer
(但可透過unsafe來使用)
   Multiple Inheritance
(透過interface來實踐)
(透過interface來實踐)
   Macro
   Template
   Operator Overloading
   Structure
   Enumeration
   Exception Handling


其實我以前也是學C++起來的,C++的強大其實這是大部分的程式員都認同的,它是C語言的演化,所以有了類似物件導向的概念。但是語言是透過時代的演進下而慢慢的產生了新技術,所以進而誕生了Java這樣的物件導向程式語言。C#就是在這樣的概念下又產生了一個相似的兄弟語言。創造C#Anders Hejlsberg目的也是希望能比Java好還要更好的使用技術(但是不是就見仁見智了)
 我們先來討論C++C++是一種概稱C語言加上物件的觀念,基本上(基本上啦~), 我個人的經驗是覺得,如果要真的懂如何去學習程式這門技術,一定要懂怎麼寫C/C++,或者ASM這兩個最接近電腦語言的程式語言。因為比較能夠真正的去了解到電腦的運作方式,如何寫才會有最好的效能,懂的演算法的呈現。之後再去學習C#這類的高階語言時,會非常容易了解如何的運用。我覺得C/C++ASM就像是古代武學的內功一樣,通常我覺得會C/C++ASM的人通常比較少人上手其它語言時會很困難。


C#理論上也算是C++的一種演化只不過C#更為高階一些記憶體配置或是記憶體回收等等這些麻煩又複雜的低階工作都由C#幫你完成, C# programmer只需專注於.Net函式庫的應用和程式開發. C#可以很容易引用VCDLLVBCOM, C#具有強大的物件功能豐富的.Net Library, 數量精簡的關鍵字優良的程式語言架構JAVA類似的語法以及如同VB一般的方便使用。


簡單的說,就是諸如像是C#這類的語言,都已經把以前程式員會遇到的問題,都幫你排除,你只要稍微寫一點程式,就可以有很大的效果。當然啦,如果是追求程式藝術講究執行速度和硬體驅動控制, C/C++ASM還是第一把交椅,可以參考使用微軟的Visaul C++C#必須在.Net Framework平台上執行並透過.Net Framework提供的大量簡易使用的函式庫來達到快速的發展應用程式的目的. C#不適合低階應用因為用到了unmange code就不太好管理也破壞了.Net 跨平台的優點。
 Java基本上能運用的層面也是很廣,它除了效能上是比較不適合寫低階的控制上,其它你能想的到的技術,它大部分都能實現,發展的十分成熟,程式的結構本身也不難學習,但Java其實是一個不太容易上手的技術,它的難不是難在程式的寫作上,而是在環境的設定,很多人常常光在設定架構上,就望之卻步了,我曾經也遇到新手的程式員,會寫Java程式,但是面對一個他未曾從頭開始建置的專案時.他常常會搞不懂怎麼讓Java裡的程式運行起來。
 通常我們也很常用Java來寫Server端的應用,或者Web Client的應用,App應用程式,或者Mobile系統,這是Java目前在市場上常看到的應用方式。最有名的就是大家目前最熟悉的「Android」、「當個創世神」啦
 如果你考慮到完全的跨平台可以選擇JAVA (其實現在微軟也慢慢往真正的跨平台方向邁進), 如果你單純的想要學學程式語言學學程式流程和資料結構等等基礎功, DOS下的C++是最好的入門選擇。C#是微軟幫開發者能想到很麻煩的事情,都幫你處理掉了,所以想要快速製作網站,可以考慮C#
 最後我必須要說,任何一門技術都可以玩的很厲害,端看自已投入學習多少喔。


-雲遊山水為知已逍遙一生而忘齡- 電腦神手

2013年12月26日 星期四

Visual Studio的自動縮排

在eclipse和vs中都有自動排版功能
在eclipse中是:ctrl+shift+f
在visual Studio:先選中你要自動排版的內容,或者ctrl+a之後ctrl+k,然後ctrl+f 。這樣就全文自動排版了。
以下是在介面上的操作方式。

選擇縮排樣式

  1. 在 [Tools工具] 功能表上,選取 [Option選項]。
  2. 在 [Text Editor文字編輯器] 資料夾中,選擇 [All Langauges所有語言] 子資料夾中的 [Tabs索引標籤] 選項,將此選項設定為全域性。
    -或-
    用來進行程式設計的語言子資料夾中選擇 [Tabs索引標籤] 選項。
  3. 在 [Indenting縮排] 下選取下列其中一項:
    • [None] -- 游標將移至下一行起點。
    • [Block區塊] -- 游標將使下一行與前一行對齊。
    • [Smart智慧] -- (可供使用時為預設值) 您用來進行程式設計的語言會決定要使用的適當縮排樣式。 例如,當您在 Visual Basic 中建立 "For...Next" 迴圈,此迴圈中包含 If 或 Select Case 陳述式,這些陳述式會在迴圈 (自訂的內部縮排將予以保留) 中顯示為縮排的程式碼區塊。
  4. 按一下 [Ok確定]。

若要變更縮排索引標籤設定值

  1. 在 [Tools工具] 功能表上,選取 [Options選項]。
  2. 在 [Text Editor文字編輯器] 資料夾中,選擇 [所有語言] 子資料夾中的 [Tabs索引標籤] 選項,將此選項設定為全域性。
    -或-
    在用來進行程式設計的語言子資料夾中選擇 [索引標籤] 選項。
  3. 若要指定定位和縮排作業中所使用的定位字元,請選取 [保留定位點]。
    -或-
    若要指定使用的空白字元,請選取 [插入空格]。
  4. 如果選擇 [插入空格],請在 [定位點和縮排大小] 中輸入用來代表每個定位點和縮排的空白字元數目。

若要手動增加或減少縮排

  1. 選擇要縮排的文字。
  2. 要增加縮排時,請按 TAB 鍵或選取 [縮排] 圖示。
    若要減少縮排,則按 SHIFT+TAB 鍵組合或選取 [取消縮排] 圖示。

將智慧型縮排套用至選取的程式碼

  1. 為您程式設計所使用的語言,在 [縮排] 中選取 [智慧] 選項。 如需詳細的指令,請參閱此主題稍早所提到的「若要選擇縮排樣式」程序。
  2. 選取您想要套用 [智慧] 縮排的文字。
  3. 在 [編輯] 功能表中選取 [進階],並且選擇 [格式化選取範圍],或按組合鍵 CTRL+K、CTRL+F。
    [格式化選取範圍] 將開發語言的智慧型縮排規則套用至選取文字中。

若要將定位點長度的空白區 (White Space) 轉換為定位點,或將定位點轉換為空白區

  1. 選取要轉換的文字。
  2. 在 [編輯] 功能表上選取 [進階]。
  3. 選擇 [選取範圍空白鍵轉定位鍵],將定位點長度的空白區轉換為定位字元。
    -或-
    選擇 [選取範圍定位鍵轉空白鍵],將定位字元轉換為定位點長度的空白區。
    將會轉換第一個字母、數字或符號左邊的所有定位或空白區。 位於程式碼行中或行尾的定位或空白區則不受影響。
-雲遊山水為知已逍遙一生而忘齡- 電腦神手

2013年12月25日 星期三

NuGet操作 - Extending擴展

這次要提到的,是NuGet的封裝擴展,有些封裝的安裝新指令可以在Package Manager Console window中使用新的命令。像是MvcScaffolding這樣的封包,可以用建立命令來生成ASP.NET MVC的控制器和視圖命令。下圖顯示了安裝MvcScaffolding創建一個新的命令Scaffold,完成tab expansion。

創建一個PowerShell腳本擴展,該模塊ClassNamer.psm1的代碼如下所示:

function Get-ClassName {

    $ie = new-object -com InternetExplorer.Application

    $ie.navigate("http://www.classnamer.com/")

    if (!$ie) { Write-Host "variable is null" }

    while ($ie.Busy -eq $true)

    {

        Start-Sleep -Milliseconds 1000;

    }



    $doc = $ie.Document

    if (!$doc)

    {

        Write-Host "variable is null"

        return "SorryCantGiveYouAGenericClass"

    }

    $answer = $doc.getElementByID("classname")

    return $answer.innerHtml


}

Export-ModuleMember Get-ClassName

有兩部分此代碼,函數的定義和定義 public函數,從模塊組的導出命令。這裡是Get-類名函數的簡短描述:


  • 建立一個IE Object
  • 瀏覽獲得頁面
  • 睡眠而忙碌(或許應該加上一個最大循環計數器)
  • 得到的文檔,這是web頁面的DOM
  • 查詢相關元素的doc Object和取得的Value


接下來的部分是寫獲得該模組導入的Script,init.ps1到Package Manager Console,該代碼如下所示:

param($installPath, $toolsPath, $package, $project)


Import-Module(Join-Path $toolsPath ClassNamer.psm1)


當上述Script運行時,將導入模塊ClassNamer.psm1。現在需要做的就是把兩個PowerShell的文件放在一個文件夾的工具,並在同一個文件夾中,執行了NuGet的命令規範ClassNamer tools文件夾。該命令將產生一個ClassNamer.nuspec文件的default metadata。當我們在ClassNamer.nuspec執行NuGet pack,它會創建一個pack,其中包含工具文件夾,當我們在Visual Studio安裝的軟體包的init.ps1腳本會被NuGetybgz執行行和安裝模組。如果部驟正確,將能夠看到已經安裝的軟件包並運行新的Get-類名的命令。

-雲遊山水為知已逍遙一生而忘齡- 電腦神手

2013年12月24日 星期二

NuGet操作 - Install安裝指南

這是分享的是一個很重要操作技巧,Nuget的安裝。介紹如何透過PowerShell命令查尋、安裝、刪除和更新NuGet軟件包。開發者可以使用管理NuGet軟件包對話框封裝工作。
如果想安裝一個程式封裝包在開啟於專案裡時,使用PowerShell命令是必需的。在某些情況NuGet也需要使用PowerShell在一些只可以存取的封裝

NuGet是一個簡化程式庫安裝程序的Visual Studio 2010延伸套件,由微軟RD與開發社群共同開發,以Open Source方式釋出。透過NuGet,能有效簡化程式庫的安裝程序,另外還提供版本更新、移除等功能,將下載安裝程式庫的動作簡化到點一下滑鼠就完成。

從Tools menu中,選擇Library Package Manager,然後單擊Package Manager Console。




下方會顯示Package Manager Console的視窗



這兩個下拉列表設置,讓你從你的窗口中輸入命令省略參數的默認值:

在封裝資源列表,使用希望輸入的命令選擇默認資源(NuGet package feed)。通常官方的NuGet封裝資源是默認值。有關 alternative feeds的更多信息,請參考Nuget官方網站文件
在默認的項目列表中,使用命令執行要運作的默認項目。 (默認值將在解決方案,當打開的窗口之一的第一個項目,不一定是已經在解決方案資源管理器中選定的。)
當輸入命令時,可以覆蓋這些默認值。在Package Manager Console視窗中,Get-Package-ListAvailale 在命令提示下查看可供選擇的封裝資源中所有包涵的列表。




對於默認的軟件包源,該命令會列出數以千計的包。但更好的方法是指定一個過濾器。

例如,要查找日誌記錄包ELMAH,輸入Get-Package -ListAvailable -Filter elmah (封裝的名稱)或Get-Package -Filter Logging -ListAvailable(在封包描述裡的一個關鍵字)。


可以使用Get-package命令指定更多的選項,輸入Get-Help Get-Package,或者Package Manager Console Powershell Reference。



對於使用安裝封裝命令中指定多個選項,輸入Get-Help Install-Package或Package Manager Console PowerShell Reference。

NuGet指定的封裝檢索和封裝在Default project drop-down list中選擇該項目安裝它(除非在命令中指定一個不同的項目)。文件被複製到解決方案,參考可能被添加到項目中,該項目的app.config或web.config文件可能被更新。

如果正在安裝的封裝依賴於其他程序包但還沒安裝,NuGet會安裝已輸入的。

如果封裝需要接受許可,不會被提示在對話框中。相反的,訊息會指出使用該函式庫的構成許可證驗收。



你可以在Solution Explorer的references看到Visual Studio已經安裝好的library。


如果app.config or web.config file已經有更新,會看到例如安裝ELMAH上的參數


新的資料夾就會被建立在solution folder,如果專案沒有solution folder,封裝資料夾會建立在project folder。



該文件夾包含每個已安裝包中的子文件夾。子文件夾包含由包安裝的文件。它還包含包文件本身(。nupkg文件,該文件是包含所有包中包含的文件的zip文件)。



可以在專案中使用Library。當輸入程式碼時,智慧感知技術就會跳出函式庫和功能。




2013年12月23日 星期一

C# - Enum列舉

Enum(列舉) C 語言時代就是賦予常數值可讀意義的簡便方法,效果是列舉出多個常數,並設定數值。

以下是C語言的例子:
enum{ stop, stand, run };

大括號中每一個元素稱為列舉元。 如果沒設定數值,預設是從0開始遞增。如果要設定數值,可以這樣打 enum{ stop=5, stand, run }; 這樣就會變成 (stop=5 ; stand=6 ; run=7) 也可以這樣用 enum{ stop=5, stand, run=2 };


Enum列舉是Java裡很常見的一個型別,Java 的列舉型別是一種特殊型別,當我們要在列舉型別的場合中加上泛型能力時,需要運用一些不同的處理手段。我們也需要用到 Reflection (反射)


以下是Java Enumclass定義:

public abstract class Enum<E extends Enum<E>> implements Comparable<E>, Serializable {
    public final int compareTo(E o)
    {
        Enum other = (Enum)o;
        Enum self = this;
        if (self.getClass() != other.getClass() && // optimization

            self.getDeclaringClass() != other.getDeclaringClass())

            throw new ClassCastException();

        return self.ordinal - other.ordinal;
    }
}

Enum是個抽象類別,無法直接實例化,它實作了Comparable介面,在compareTo()方法中,主要是針對ordinal成員比較,也就是在需要排序Enum實例的場合,是依據ordinal成員進行排序。

C#Enum 關鍵字用來宣告列舉型別 (Enumeration),是由一組名為列舉值清單的具名常數所構成的獨特型別,Enum算是整數(int)型別,當然,也可以指定成long, byte, short.....等型別,我們叫作「基底型別」。例如:

enum Days { Sat, Sun, Mon, Tue, Wed, Thu, Fri };

每個列舉型別都有基礎型別,此基礎型別可以是除了char型別以外的任何整數型別。列舉項目的預設基礎型別是int。根據預設,第一個列舉值的值是0,而每一個接下來的列舉值會遞增1,列舉值的名稱中可能不包含空格。

不論是指派其它值做為新版本的列舉,或是變更新版本之列舉成員的值,都可能造成相依的原始程式碼發生問題。常見的情況是,enum 值用於 switch 陳述式中,而且如果其他項目又加入至 enum 型別,則預設值的測試將會傳回非預期的 true


public class EnumTest
{
    enum Days { Sat = 1, Sun, Mon, Tue, Wed, Thu, Fri };

    static void Main()
    {

        int x = (int)Days.Sun;
        int y = (int)Days.Fri;

        Console.WriteLine("Sun = {0}", x);

        Console.WriteLine("Fri = {0}", y);
    }
}

public class EnumTest
{
    enum Days { Sat = 1, Sun, Mon, Tue, Wed, Thu, Fri };

    static void Main()
    {
        int x = (int)Days.Sun;
        int y = (int)Days.Fri;

        Console.WriteLine("Sun = {0}", x);
        Console.WriteLine("Fri = {0}", y);
    }
}

在這個範例裡,宣告了一個 Days 列舉型別。兩個列舉值會明確轉換成整數,然後指派給整數變數。所以在三種程式語言的比較,其實大致上都是大同小異。

以下範例enum型別的轉換是ComPort的三個enum型別的變數 parity, stopbits, handshake,要從字串轉換成enum型別,注意enum 型別的轉換方法:


parity = (System.IO.Ports.Parity) Enum.Parse(typeof(System.IO.Ports.Parity), "None");

stopbits = (System.IO.Ports.StopBits) Enum.Parse(typeof(System.IO.Ports.StopBits), "One");
handshake = (System.IO.Ports.Handshake) Enum.Parse(typeof(System.IO.Ports.Handshake), "None");

-雲遊山水為知已逍遙一生而忘齡- 電腦神手