投稿類別 : 資訊類 篇名 : 從 VB.Net 學 C# 作者 : 陳諭瑩 高雄市立高雄高級工業職業學校 資訊科高三乙班王子喬 高雄市立高雄高級工業職業學校 資訊科高三乙班李宗恩 高雄市立高雄高級工業職業學校 資訊科高三乙班 指導老師 : 莊利吉老師
壹 前言 一 研究動機 在高職裡 VB.Net 是課程標準, 但由於現在職場上大部分都是使用 C#, 所以我們用 VB.Net 的基礎學 C#, 再利用高職所學到的 VB.Net 程式範例轉換成 C#, 比較兩者語法上的 差異, 快速學習 C# 二 研究目的 1 學會使用 C# 寫程式 2 設計不同的程式範例, 並輸出結果 3 比較 VB.Net 和 C# 的語法和重要特點 三 研究方法 ( 一 ) 研究過程 1 準備期 : 學習 C# 的程式語法 2 選擇程式結構 : 選擇要使用的程式結構 3 程式設計 : 將不同的程式結構做成範例, 並輸出結果 ( 二 ) 研究工具 1 硬體 : 個人電腦 2 軟體 :Visual Studio 2008 貳 正文 正文部份主要說明文獻探討與研究結果, 共分六個小節, 依序是基本概念 數值資料處理 選擇結構的指令 :If 敘述 重複結構指令 :Do Loop 與 For Next 敘述 陣列與排序 自訂副程式與參數傳遞 主要針對主控台應用程式的程式範例比較 VB.Net 和 C# 的語法和重要特點 一 基本概念 ( 一 ) 程式範例 : 輸入圓半徑, 並算出圓面積 1
表 1 BASIC 和 C# 的程式比較 Dim r As Integer ' 宣告變數 string r; // 宣告字串 Console.Write(" 輸入圓半徑 :") ' 提示訊息 Console.Write(" 輸入圓半徑 :"); // 提示訊息 r = Console.ReadLine ' 輸入圓半徑存於變 r = Console.ReadLine(); // 輸入圓半徑存於字 數 r 串 r Console.Write(" 圓面積等於 =") ' 提示訊息 Console.Write(" 圓面積等於 ="); // 提示訊息 Console.WriteLine(r ^ 2 * 3.14) ' 計算圓面 Console.WriteLine(Math.Pow(float.Parse(r), 2) * 積, 然後輸出 3.14); // 計算圓面積, 然後輸出 Console.ReadKey() ' 等待直到使用者按下任 Console.ReadKey(); // 等待直到使用者按下 意鍵 任意鍵 二 數值資料處理 ( 一 ) 算術運算子符號 表 2 算術運算子範例彙整表 ( 許清榮 賈大誠,2006) 運算子 說明 + 加 - 減 * 乘 / 除 Mod % 取餘數 ^ 次方 ( 二 )Math 類別 表 3 BASIC 與 C# 常用 Math 類別範例 ( 莊利吉,2008) Math.Ceiling(A) 得大於或等於 A 的最小整數 Math.Floor(A) 得小於或等於 A 的最大整數 Math.Exp(A) 得 e A, 其中 e 為自然數約等於 2.7 Math.Log(A) 得 lna, 其中 ln=loge, 以 e 為底的對數 Math.Log10(A) 得 loga Math. Pow(A,0.3) 得 A 0.3 Math.Round(A) 將 A 四捨五入為整數 Math.Round(a, 1) 將 A 四捨五入成一位小數 Math.Sqrt(A) 得 A 的平方根, 相當於 A^0.5 Math.Truncate(A) 捨棄 A 的小數變成整數 三角函數 例如 Math.Sin(30*Math.PI/180) 等於 Sin(30 ) 2
( 三 ) 程式範例 : 四捨五入成只有 2 位小數 從 VB.Net 學 C# 表 4 BASIC 和 C# 的程式比較 Dim a As Single = 0 string A = ""; Console.Write(" 輸入一個至少有 3 位小數的浮 double a = 0; 點數 ") Console.Write(" 輸入一個至少有 3 位小數的浮 a = Console.ReadLine 點數 "); a = Math.Truncate(a * 100 + 0.5) / 100 A = Console.ReadLine(); Console.Write(" 四捨五入成只有 2 位小數 ") a = Math.Truncate(double.Parse(A)* 100 + 0.5) Console.WriteLine(a) / 100; Console.ReadKey() Console.Write(" 四捨五入成只有 2 位小數 "); Console.WriteLine(a); Console.ReadKey(); 三 選擇結構的指令 :IF 敘述 ( 一 ) 比較運算子與邏輯運算子 表 5 運算子符號彙整表 ( 莊利吉,2008) 類別比較邏輯位元 運算子符號 功能 = = 等於 <>!= 不等於 < < 小於 <= <= 小於等於 > > 大於 >= >= 大於等於 Not! 取反向 AndAlso && And 且, 所有條件成立才成立 OrElse 或, 有一條件成立才可成 Or 立 Xor ^ 互斥 And & 且 Or 或 Not! 取反向 3
( 二 ) 語法 表 6 BASIC 與 C# 語法比較 ( 旗立研究室,2014) If 條件式 1 Then if ( 條件式 1) [ 敘述區塊 1 ] [ ElseIf 條件式 2 Then ] [ 敘述區塊 1; ] [ 敘述區塊 2 ] [ ElseIf 條件式 3 Then ] [ else if ( 條件式 2) ] [ 敘述區塊 3 ]. [ 敘述區塊 2; ] [ Else [ 敘述區塊 N ] ] [ else if ( 條件式 3) ] End If [ 敘述區塊 3; ]. [ else [ 敘述區塊 N; ] ] ( 三 ) 程式範例 : 求 a,b,c 三者的最大值 表 7 BASIC 和 C# 的程式比較 If a >= b AndAlso a >= c Then if (a >= b && a >= c) max = a ElseIf b >= c AndAlso b >= a Then max = a; max = b Else else if (b >= c && b >= a) max = c End If max = b; else max = c; 4
四 重複結構指令 :Do 與 For 敘述 ( 一 )Do 敘述 1 語法 表 8 BASIC 語法 ( 旗立研究室,2014) 前測式迴圈語法 Do While 條件式 Do Until 條件式 [ 敘述區塊 ] [ 敘述區塊 ] [ Exit Do ] [ Exit Do ] [ 敘述區塊 ] [ 敘述區塊 ] Loop Loop 後測式迴圈語法 Do Do [ 敘述區塊 ] [ 敘述區塊 ] [ Exit Do ] [ Exit Do ] [ 敘述區塊 ] [ 敘述區塊 ] Loop While 條件式 Loop Until 條件式 表 9 C# 語法 ( 旗立研究室,2014) 前測式迴圈語法 while ( 條件式 ) while (!( 條件式 )) [ 敘述區塊 ; ] [ 敘述區塊 ; ] [ break ] [ break ] [ 敘述區塊 ; ] [ 敘述區塊 ; ] 後測式迴圈語法 do do [ 敘述區塊 ; ] [ 敘述區塊 ; ] [ break] [ break] [ 敘述區塊 ; ] [ 敘述區塊 ; ] while ( 條件式 ) while (!( 條件式 )) 2 程式範例 : 求兩數最大公因數 ( 前測式迴圈 ) (1) 方法一 表 10 BASIC 和 C# 的程式比較 Remainder = INPNO1 Mod INPNO2 Remainder = INPNO1 % INPNO2; Do While Remainder <> 0 while (Remainder!= 0) INPNO1 = INPNO2 INPNO2 = Remainder INPNO1 = INPNO2; Remainder = INPNO1 Mod INPNO2 INPNO2 = Remainder; Loop Remainder = INPNO1 % INPNO2; 5
(2) 方法二 表 11 BASIC 和 C# 的程式比較 Remainder = INPNO1 Mod INPNO2 Remainder = INPNO1 % INPNO2; Do Until Remainder = 0 while (!(Remainder == 0)) INPNO1 = INPNO2 INPNO2 = Remainder INPNO1 = INPNO2; Remainder = INPNO1 Mod INPNO2 INPNO2 = Remainder; Loop Remainder = INPNO1 % INPNO2; ( 二 )For 敘述 1 語法 表 12 BASIC 與 C# 語法比較 ( 莊利吉,2008) For counter [As datatype ]=start To end [Step For ([ datatype ] counter=start; counter<=end; step] counter= counter + step) [ 敘述區塊 ] [ Exit For ] [ 敘述區塊 ; ] [ 敘述區塊 ] Next [ break ] [ 敘述區塊 ; ] 2 程式範例 : 算出 1 到 N 的總和 表 13 BASIC 和 C# 的程式比較 For i As Integer = 1 To N for (int i = 1; i <= N; i++) Sum = Sum + i Next Sum = Sum + i; 6
五 陣列與排序 ( 一 ) 陣列宣告 1 語法 (1) 明確指定索引上限 表 14 BASIC 與 C# 語法比較 ( 莊利吉,2008) Dim 陣列名稱 ( 索引上限 ) As 資料型別資料型別陣列名稱 [ 索引上限 ]; (2) 沒有指定索引上限 表 15 BASIC 與 C# 語法比較 ( 莊利吉,2008) Dim 陣列名稱 () As 資料型別 = 初值 1, 初值資料型別陣列名稱 [] = 2, 初值 3, 初值 1, 初值 2, 初值 3, ( 二 ) 排序 1 程式範例 : 輸入第 1 到第 N 數 表 16 BASIC 和 C# 的程式比較 For i As Integer = 1 To N for (int i = 1; i <= N; i++) Console.Write(" 第 ") Console.Write(i) Console.Write(" 第 "); Console.Write(" 數 :") Console.Write(i); Item(i - 1) = Console.ReadLine Console.Write(" 數 :"); Next Item[i - 1] = Console.ReadLine(); 六 自訂副程式與參數傳遞 ( 一 ) 函數 (Function) 7
1 語法 表 17 BASIC 與 C# 語法比較 ( 莊利吉,2008) Public Private Function 函 數 名 稱 public private 資料型態函數名稱 ([ ref ([ByVal Byref 參數名稱 1 As 資料型 資料型別參數名稱 1,. ]) 別,.]) As 資料型態 [Return 運算式 ] [return 運算式 ] End Function 2 程式範例 : 設計一個程序可將 1+2+3+ +N 之和透過參數 Sum 傳回呼叫端 表 18 BASIC 和 C# 的程式比較 Private Function Test(ByVal N As Integer) As Integer private int Test(int N) Dim x As Integer, y As Integer = 0 'y 是預 int x = 0; 備傳回之值 For x = 1 To N y = y + x Next Return y End Function int y = 0; //y 是預備傳回之值 for (x = 1; x <= N; x++) y = y + x; return y; ( 二 ) 程序 (Subroutine) 1 語法 表 19 BASIC 與 C# 語法比較 ( 莊利吉,2008) Public Private Sub 程序名稱 ([ByVal Byref public private void 程序名稱 ([ ref 資料型 參數名稱 1 As 資料型別,.]) 別參數名稱 1,. ]) End Sub 8
2 程式範例 表 20 BASIC 和 C# 的程式比較 Private Sub Test(ByVal N As Integer, ByRef Sum As Integer) private void Test(int N, ref int Sum) Dim x As Integer, y As Integer = 0 'y 是預 int x = 0; 備傳回之值 For x = 1 To N y = y + x Next Sum = y End Sub int y = 0; //y 是預備傳回之值 for (x = 1; x <= N; x++) y = y + x; Sum = y; 叄 結論 一 問題與討論 ( 一 )VB.Net 與 C# 的語法差異 VB.Net 和 C# 在一些重要功能上有差異 其中, 型別規範算是 VB.Net 與 C# 最大的不同之處 C# 屬於強型別程式語言, 而 VB.Net 屬於弱型別程式語言 舉個例子來說, 表 1-1 的程式範例在計算圓面積時, 輸入的圓半徑屬於字串型別, 而在計算圓面積時的半徑屬於變數型別 C# 因為屬於強型別, 所以程式不會自動將輸入的圓半徑 r 轉成變數型別, 需要寫成 C onvert.toint32(r) 才行 相反地,VB.Net 會在合理範圍內視情況自動轉換型別 C# 是大小寫相關的 ( 許清榮 賈大誠,2006) 所以, 當關鍵字或變數名稱的英文大小寫不同時, 編譯器會視為不同的東西 變數的大小寫不同, 編譯器會視為兩個變數 ; 而關鍵字的大小寫不同, 則不會被編譯器接受 VB.Net 會自動調整關鍵字的大小寫, 使編譯器能夠接受 BASIC 的變數則不能同時接受大小寫不同字母卻相同的多個變數 C# 和 BASIC For 迴圈都有變量自加的功能 假如初始值每次在迴圈執行時的遞增值為 1,C# 會寫成 i++ (i=i+1) 與 ++i 兩種寫法 i++ 指的是先用再加, ++i 指的是先加再用 ;BASIC 則是用 Step 1 表示 另外,BASIC 重複結構指令的 For 迴圈與 While 迴圈的結尾分別匯加上 End If 和 Loop C# 的結尾則不用加這兩道指令 C# 的條件式會使用小括號, 敘述區塊則使用大括號 如果一個敘述區塊內只有一道指令, 大括號可以省略 BASIC 並沒有指標, 而 C# 有提供指標類型, 但只能在 unsafe 模式下才能進行編譯, 9
而且須在宣告指標的方法名稱前面加上 unsafe 關鍵字才能執行 ( 許清榮 賈大誠,2006) 由於有一定程度的安全性威脅, 一般 C# 也不建議使用 副程式參數傳遞方式分為 傳值呼叫 (call by value) 與 傳址呼叫 (call by reference) 兩種 Call by value 從主程式傳入參數時, 經方法運算完之後並不會影響主程式所傳入的參數值 ; 而 Call by reference 從主程式傳入參數之後, 經由方法運算之後, 會指向同一個記憶體位址, 所以也影響了主程式當時所傳入的參數值 Private 只有在同一個類別下才能存取它, 是最嚴格的範圍存取條件 Public 存取範圍不受到任何限制, 是最寬鬆的存取範圍條件 二 未來研究建議 1 用 C# 設計物件導向程式 2 從 BASIC 學 C# 後, 再從 C# 學 JAVA 和 C++ 3 了解用 C# 與資料庫的連線方式與管理 肆 引注資料 莊利吉 (2008) 程序導向程式設計: 以 VB.Net 主控制台程式為例 ( 精簡版 ) 許清榮 賈大誠 (2006) Visual C#2005 建構資訊系統實戰經典教本 新北市汐止區 : 博碩文化 楊仁和 ( 譯 )(2007) 深入淺出 C# 臺北市: 歐萊禮 旗立研究室 (2014) 計算機概論 A 滿分總複習 臺北市 旗立資訊股份有限公司 10