Transcript 投影片1

第3章
C# 語法快速導覽
本著作含書附光碟之內容 (不含 GPL 軟體),僅授權合法持有本書之讀者(包含個人及法人)非
商業用途之使用,切勿置放在網路上播放或供人下載,除此之外,未經授權不得將全部或局部內
容以任何形式重製、轉載、散佈或以其他任何形式、基於任何目的加以利用。
著作權所有 © 旗標出版股份有限公司
本章重點提要





3-1 本章程式設計方法與 C# 基本語法
3-2 變數與常數
3-3 資料型別
3-4 運算式、運算子與型別轉換
3-5 流程控制
2
本章重點提要
陣列與 foreach 迴圈
 3-7 程序
 3-8 類別與物件
 3-9 命名空間與 .NET Framework 通用類別/
元件
 3-10 使用插入程式碼片段的功能快速撰寫程
式
 3-6
3
3-1 本章程式設計方法與 C# 基本
語法
 雖然視覺化工具可以幫我們輕鬆建立網頁的各
項元件, 讓程式的撰寫量減到最低, 但是這並不
代表完全不需要程式語言了。要讓網頁動起來,
還是需要使用程式語言為網頁注入靈魂。本章
將說明 C# 的基礎語法, 讓您瞭解如何使用撰
寫 ASP.NET 網頁程式。
4
使用 Page_Load 事件執行程式
 為了降低學習的複雜度,
本章說明 C# 的語法
時, 會將所有範例程式放置於網頁的
Page_Load 事件處理程序中。Page_Load 是
網頁載入時一定會被觸發的程序, 所以將程式
碼放置於此, 便可以在網頁載入時立刻看到程
式執行的結果。關於程序與事件處理程序的觀
念, 會在 3-7 節詳細說明。
 請在 VWD 內開啟任一 aspx 網頁, 若是在原始
檔模式, 請如下操作即可產生 Page_Load 事件
處理程序:
5
使用 Page_Load 事件執行程式
6
使用 Page_Load 事件執行程式
 若是在設計模式下,
於網頁空白處雙按滑鼠左
鈕, VWD 一樣也會產生Page_Load 程序, 並自
動切換到原始檔模式。
 本節隨後說明範例程式時, 除非包含了 "<%@
Page Language="C#" %>" 指示詞, 或者有另
行說明, 否則都將只列出應放置於 Page_Load
程序內的程式碼, 不再列出其他 ASP.NET 或
HTML 標籤。
7
使用 Response.Write() 顯示程式輸出
 同樣地,
為了降低學習的複雜度, 本章的程式執
行後若需輸出文字, 都將直接使用
Response.Write() 於網頁上顯示字串。其語法
相當簡單, 只要使用『Response.Write(" 字串
");』, 即可將字串顯示於網頁上:
8
使用 Response.Write() 顯示程式輸出
9
使用 Response.Write() 顯示程式輸出
10
使用 Response.Write() 顯示程式輸出
第
2 章曾經說明 HTML 檔案的結構, 而上面可
以看到在 Page_Load 程序以 Response.Write() 輸出字串雖然容易使用, 但卻會破壞
HTML 的結構。本章為了降低學習複雜度而暫
時使用此法, 不過隨後第 4 章開始, 會介紹正確
的字串顯示方式。此外, 程式輸出時如果要顯
示多行, 或者想要斷行將文字顯示於新的一行,
只要使用 HTML 的 <br /> 語法即可:
11
C# 基本語法
程式是以『敘述』 (Statement) 為執行的
單位, 每一個 C# 指令的結尾都必須加上分號
(;), 一行可以多個敘述, 或是一個敘述也可以拆
成多行:
 C#
12
C# 基本語法
會區分英文的大小寫, 所以不論是程式敘述
或是變數、控制項名稱,都要特別區分大小寫的
差別。如果需要加上註解, 則必須在註解文字
前面加上兩個斜線 (//), 只要 // 不是出現在標示
字串的引號內, 從 // 之後到該行結束為止, 所有
的文字都會被視為註解::
 C#
13
C# 基本語法
 如果有多行文字都是註解,
使用 // 必須每一行
都標示, 較不方便, 此時可改用 /*...*/ 標示法,
不管間隔幾行, 凡是在 /* 和 */ 之間的內容都會
被視為註解:
14
C# 基本語法
程式中, 所有字串都必須使用雙引號 (") 括
住, 字元則應該使用單引號刮住:
 C#
15
C# 基本語法
 由於單引號與雙引號是具有特殊意義的字元,
所以若輸出字串時要顯示單引號或雙引號, 必
須加上反斜線 (\) 取消其特殊意義:
Resp on se .Wr i te ("He ll o , \ "Ton y\" 您好" ) ;
會輸出 He ll o , "To ny" 您好
16
C# 基本語法
 同樣的,
若要顯示反斜線, 應該如下輸出:
17
3-2 變數與常數
 瞭解
C# 程式的基本語法基礎後, 本節將為您
介紹程式設計中最基本,也最重要的元素 - 變
數 (Variable)。
18
變數的宣告
 宣告變數的語法如下:
 下例宣告一個名稱為
i 的變數, 指定其資料型
別為整數, 然後將 3 放進變數 i 中:
19
變數的宣告
 宣告變數除了定義資料型別外,
也可以如下同
時設定變數內容:
 一個敘述中也可以如下定義多個變數:
20
常數的宣告
 前面介紹了變數的宣告與使用方法,
另外還有
一種與變數相對, 稱為常數 (Constant)。顧名
思義, 變數存放的資料可以隨時改變, 而常數所
儲存的資料則是恆常不變, 所以稱之為常數。
常數通常用來定義程式中常會用到, 而且不想
被更動的資料, 宣告常數的語法如下:
21
常數的宣告
 變數可以先宣告,
之後再設定變數值, 但是常數
則必須在宣告時指定常數值:
22
存取變數值與常數值
 變數與常數宣告並指定值之後,
只要直接將名
稱放入程式敘述, C# 便會自動將其代換為變數
值或常數值:
23
存取變數值與常數值
24
變數與常數的命名規則
 宣告變數與常數時,
名稱可以隨意設定, 但是必
須符合以下規則:
■ 名稱的開頭必須使用中文字、英文字母或底
線_。
■ 除了開頭外, 名稱的其他部分可以使用中文
字、英文字母、底線 _ 或數字。
■ 名稱中不得包含標點符號或特殊字元。
■ 不可以C# 的保留關鍵字為名, 例如 int、
const...。C# 所有保留關鍵字請參考 VWD
線上說明中的 "C# 關鍵字" 段落。
25
3-3 資料型別
 數值型別
 布林、字串、物件型別
26
數值型別
 數值型別可區分為
3 大類, 分別是整數、浮點
數與 decimal 型別, 如果變數存放的數字完全
沒有小數, 只要使用整數型別即可, 否則就要使
用浮點數或 decimal 型別。
27
整數型別
 下表列出整數型別的種類:
28
整數型別
 請注意,
char 雖然屬於整數型別, 但是存放於
其中的數值是 Unicode 字元的內碼, 所以設定
char 型別的變數時, 必須使用字元, 不能直接
指定數字:
29
浮點數型別
 下表為浮點數型別:
 請注意,
C# 會將帶有小數點的數字視為
double 型別, 所以若將帶有小數點的數字設定
給 float 型別的變數, 便會產生錯誤:
30
浮點數型別
 如果要將帶有小數點的數字指定給
float 型別
的變數, 必須在數字後面使用後置字元 f 或 F,
指定該數字為 float 型別:
31
decimal 型別
 下表說明
decimal 型別:
 浮點數型別內部是以近似值的方式來儲存數字,
所以浮點數型別可能會在某些數字失去精確度,
而 decimal 型別則是精確儲存數字, 所以如果
用於財務、成績...等用途, 建議使用 decimal
型別。
32
decimal 型別
 前面提到
C# 會將帶有小數點的數字視為
double 型別, 所以若將帶有小數點的數字指定
給 decimal 型別的變數, 必須在數字後面使用
後置字元 m 或M, 指定該數字為 decimal 型別:
33
布林、字串、物件型別
 除了數值型別外,
C# 還有以下型別可以存放不
同的資料:
■ bool (布林型別):布林型別只能有兩種值:
true (真) 或 false (假), 通常用來表示某種情
況是否成立, 本節隨後討論流程控制時, 會說
明布林值的用途。
■ object (物件型別):物件型別可以存放任何
資料, 包括布林值、數字、字串、日期、陣
列、類別...等, 所以如果變數不確定會存放
什麼資料, 便可以宣告為此型別。
34
布林、字串、物件型別
■ string
(字串型別):如果要在變數內存放文
字資料, 便必須使用字串型別。請小心字串
不像數字那樣可以運算, 所以如果您將 "33"
與 "22" 分別存在兩個字串型別的變數內, 則
兩個變數相加的結果為 "3322", 而不是 "55" 。
35
3-4 運算式、運算子與型別轉換
 在上一節瞭解了各種資料型別,
有了這些資料
後, 就能進一步來處理資料。在一般的程式中,
大部分的處理工作就是運算, 例如四則運算、
邏輯比較.. .等。本節將會說明 C# 所提供的各
項運算功能。
36
什麼是運算式與運算子
 在程式語言中大部分的敘述都會包含運算式
(Expression), 而運算式則是由運算子
(Operator) 與運算元 (Operand) 所構成。其中,
運算子代表的是運算的種類 (或說是運算符號),
而運算元則是要運算的資料。舉例來說:
37
什麼是運算式與運算子
 上面例子就是一個運算式,
其中 + 是運算子,
代表要進行加法運算, 而要相加的則是 7 與 8
這兩個資料, 所以 7 與 8 就是運算元。
 不過, 運算子除了針對運算元進行運算以外, 有
些運算子也可以處理運算式, 隨後會為您介紹
各種運算子。
38
算術運算子
 一般常用的加減乘除都屬於算術運算子,
可以
用來計算數值, 下面是C# 的算術運算子:
39
算術運算子
 請注意,
使用 / 運算子進行除法運算時, 若除數
與被除數皆為整數, 則結果一定是整數 (小數部
分無條件捨去)。如果希望結果為浮點數, 必須
指定除數或被除數為浮點數:
40
比較運算子
 比較運算子會比較兩邊的運算元,
然後將結果
以布林值傳回:
41
設定運算子
 設定運算子用來設定變數或屬性的內容,
最常
使用的設定運算子為 =, 舉例如下:
42
設定運算子
 以下是其他
C# 的設定運算子:
43
邏輯運算子
 邏輯運算子會取兩邊的布林值,
進行邏輯上的
交集、聯集、互斥與否定運算, 然後將結果以
布林值傳回。各邏輯運算子的使用方法如下:
44
邏輯運算子
 以下是各邏輯運算的真值表:
45
遞增 / 遞減運算子
 承襲
C 語言的風格, C# 也提供遞增 / 遞減運算
元, 請參考下表
46
遞增 / 遞減運算子
 例如:
47
運算子優先順序
 當一個運算式內有多個運算時,
會依照下面的
優先順序來決定運算的先後:
48
運算子優先順序
49
運算子優先順序
 如果運算子的優先順序相同,
則依照其在運算
式中的位置, 由左至右依序運算。此外, 與一般
四則運算相同, 運算式中如果有小括號 (), 則小
括號內的運算會優先處理。所以如果您想要先
執行優先順序較低的運算子, 可以使用小括號
變更其順序。
50
資料型別轉換
 程式中有可能會需要將不同資料型別的運算元
放在一起運算, 此時各運算元會自動被調整為
同一資料型別以利運算, 這種自動轉換稱為
『隱含轉換』。
 進行隱含轉換時, 會以運算式中最長 (最大) 的
型別為調整基準, 以免漏失資料的精確度。例
如 int 型別變數與 double 型別變數相加時, 會
自動將 int型別變數擴大調整為 double 型別。
51
資料型別轉換
 當設定變數時,
若資料的型別與變數不同, C#
也會將資料隱含轉換為變數的型別, 然後再設
定給變數。隱含轉換只能將比較小的型別轉為
較大的型別, 因此若資料的型別比變數大, 則會
產生錯誤:
52
資料型別轉換
 請注意,
浮點數型別無法隱含轉換為 decimal
型別。此外, 若使用 + 運算子將字串型別與數
值型別相加, 數值型別會隱含轉換為字串型別,
所以結果會是兩個字串結合。
53
資料型別轉換
 除了讓程式自動進行隱含轉換外,
我們也可以
自行將資料轉為我們希望使用的型別, 此稱為
『明確轉換』。數值型別的明確轉換方法如下:
54
資料型別轉換
 隱含轉換只能將資料由較小的型別轉為較大型
別, 明確轉換則可以由大轉小, 但是必須注意由
大轉小時會造成資料損失:
55
資料型別轉換
 上面方法只能用於不同的數值型別間的轉換,
如果需要在字串型別與數值型別互轉, 必須使
用 Convert 類別提供的方法, 例如 Convert.ToString(12.56)可以將 12.56 轉換為字串。下表
列出 Convert 類別提供的方法:
56
資料型別轉換
 隱含轉換與明確轉換的範例如下:
57
資料型別轉換
58
資料型別轉換
 除了使用
Convert 以外, 幾乎所有物件都可以
使用本身的 ToString() 方法轉成字串, 例如
『int x = 3; string y = x.ToString();』。
59
3-5 流程控制
 要寫出具有實用價值的程式,
通常需要多個敘
述來進行處理, 此時必須安排程式中各敘述執
行的流程順序, 以及因應不同狀況而選擇不同
流程, 也就是流程控制 (flow control)。
 C# 的流程控制分為兩類, 一是條件判斷, 包含
if 與 switch 兩種;另一類為迴圈控制, 包含
while 、do 、for 、foreach 等迴圈。
60
if 條件判斷
 在流程控制中,
最常用的應該是 if 敘述了, 它如
同日常生活中常用的 『如果...就...』。比方說
『如果明天好天氣, 就去爬山』, 便是典型的 if
敘述。
 if 敘述的語法如下:
61
if 條件判斷
62
if 條件判斷
 在整個
if 條件判斷中, else if 與 else 並非必要
的敘述, 所以可依需求決定是否要使用 else if
或 else。另外, 您可以使用多個 else if 敘述來
進行判斷, 但是只能有一個 else 敘述。
63
if 條件判斷
 以下使用
if 條件判斷來計算購買物品時各種數
量的價格 (假設買 10 個及以上 9 折, 20 個及
以上 8 折, 30 個及以上 6 折):
64
if 條件判斷
65
if 條件判斷
66
switch 條件判斷
是一種多選一的條件判斷, 其作用類似
前面 if 加上多個 else if 所組成的多條件流程控
制。switch 的語法如下:
 switch
67
switch 條件判斷
68
switch 條件判斷
t c h 後面可以是一個運算式, 也可以只是
一個變數或常數。另外default 並非必要的敘述,
所以可依需要決定是否使用。
 一般使用 switch 迴圈時, 一個 case 會對應一
個動作, 不過您也可以如下讓多個 case 對應同
一個動作:
 swi
69
switch 條件判斷
70
switch 條件判斷
 前面曾經以
if 來計算購物時各種數量的價格
(買 10 個及以上 9 折, 20 個及以上 8 折, 30 個
及以上 6 折), 可以使用switch 改寫如下:
71
switch 條件判斷
72
switch 條件判斷
73
while 迴圈
 迴圈
(loop) 可以用來處理重複性的工作, 就像
辦公人員每天重複收發文件, 工廠操作員重複
地把原料放到機器. . .等, 程式中也可能會遇到
需要重複執行動作, 此時就需要使用迴圈來處
理。
 首先介紹的 while 迴圈相當簡單, 語法如下:
74
while 迴圈
在
while 迴圈中, 若條件運算式為 true, 便會重
複執行動作敘述, 一直到條件運算式變成 false
時才會結束迴圈。
 以下使用 while 迴圈計算 1 到 100 之間所有可
被 3 整除的數值之總和:
75
while 迴圈
76
do 迴圈
迴圈可說是 while 的一種變型, 下面是其語
法:
 do
迴圈屬於後設判斷式迴圈, 而前面介紹的
while 迴圈則屬於預先條件迴圈, 兩者的差異如
下:
 do
77
do 迴圈
■ 預先條件迴圈:進入迴圈前會先檢查條件是
否成立, 若成立才會執行迴圈。
■ 後設判斷式迴圈:會先執行迴圈一次, 然後
再檢查條件是否成立, 若成立就繼續執行下
去。所以不論條件有沒有成立, 這類型的迴
圈至少會執行一次。
 下面是一個簡單的例子, 讓您瞭解 while (預先
條件迴圈) 與 do (後設判斷式迴圈) 的差異:
78
do 迴圈
79
do 迴圈
80
do 迴圈
81
do 迴圈
 對於兩個迴圈而言,
變數 i 的初始值都是 1, 而
且條件都是變數 i 要大於 1 且小於 4。
 while 迴圈會先檢查條件, 所以會因為無法滿足
條件而不會進入迴圈;但是 do 迴圈則是不管
三七二十一都會先進入迴圈, 進入後遇到 "i +=
1" 使得變數 i 的內容變成 2, 因此可以通過最
後面的條件檢查, 而繼續執行迴圈。
82
for 迴圈
迴圈的執行方式與前面 while 與 do 迴圈不
同。while 與 do 迴圈利用條件判斷來決定是否
繼續執行迴圈, 例如可設定條件為 "i < 5", 如此
只要變數 i小於 5, 迴圈就會不斷執行。
 而 for 迴圈則是使用各種列舉值來執行迴圈, 例
如設定變數 i 列舉值為 1,2, 3 等三個值, for 迴
圈便會逐一將各個值代入變數 i, 所以總共會執
行 "i=1" 、"i=2"、"i=3" 共三次迴圈。
 所以 for 迴圈比較適用於有特定執行次數的狀
況, 而 while 與 do 迴圈則比較適合用於執行次
數不定的時候。
 for
83
for 迴圈的語法
 下面是
for 迴圈的語法:
 初始運算式只有第
1 次進入 for 迴圈時會被執
行;而條件運算式則和while 一樣, 是用以判斷
是否要繼續執行大括號的內容; 至於控制運算
式則是每一輪迴圈執行結束後都會執行的。
84
for 迴圈的語法
迴圈的使用方法相當簡單, 下面以累加 1 到
100 的奇數總和為例, 為您示範 for 迴圈的語法:
 for
85
for 迴圈的語法
迴圈中的數值變數除了使用時順便宣告外,
也可以事先設定, 這樣就能直接使用。
 for
86
巢狀迴圈
 有時候迴圈內還需要加上另一個迴圈才能解決
問題, 這種外迴圈包含內迴圈的形式稱為巢狀
迴圈。以下使用巢狀迴圈來顯示九九乘法表:
87
巢狀迴圈
88
巢狀迴圈
89
改變迴圈的 break與continue 敘述
 迴圈執行時,
除了讓迴圈依照條件或是列舉值
來判斷是否應該繼續執行外, 您也可以使用
break 敘述強制中途跳出目前所在的迴圈, 或
者也可以使用 continue 敘述結束這一輪迴圈,
直接跳到迴圈的下一輪。
 假設現在想要列出 1 到 30 之間所有不可被 9
整除的數字, 並且計算其總和, 則可以如下使用
for 迴圈與 continue 敘述來計算:
90
改變迴圈的 break與continue 敘述
91
改變迴圈的 break與continue 敘述
92
改變迴圈的 break與continue 敘述
說明
break 敘述的使用方式。假設現在只想列出九
九乘法表中乘積小於等於 25 的項目, 可以在內
迴圈中使用If 敘述檢查, 若乘積大於 25, 則使
用 break 敘述中斷內迴圈:
 接著以前面九九乘法表的範例為例,
93
改變迴圈的 break與continue 敘述
94
改變迴圈的 break與continue 敘述
95
改變迴圈的 break與continue 敘述
96
3-6 陣列與 foreach 迴圈
 雖然變數可以很方便地儲存各式資料,
不過因
為一個變數只能放一個資料, 如果需要處理大
批資料, 例如計算學生成績, 如果有 100 個學
生, 就要宣告 100 個變數, 不但程式寫起來很
長, 光是要寫上 100 個變數的名稱, 就很容易
出錯。所以為了方便處理大量資料, 便需要使
用陣列來代替多個變數。
97
陣列與 foreach 迴圈
98
陣列的宣告與使用
 與變數相同,
陣列也必須在使用前先宣告, 以下
是宣告陣列的語法:
 陣列宣告的長度,
代表該陣列可放置的元素數
量。請看下面宣告 students陣列的範例:
99
陣列的宣告與使用
 上面範例宣告了一個名為
student 的陣列, 該
陣列長度為 100, 因為陣列的初始索引編號一
律從 0 開始, 所以 student 陣列有編號
student(0) ~ student(99)共 100 個元素。
100
陣列的宣告與使用
 若要設定或取得陣列內各元素的值,
請如下使
用 『陣列名稱[索引]』 的方式即可:
101
陣列的宣告與使用
 您也可以使用下面語法,
在宣告陣列時直接設
定各元素的值:
 使用此語法時,
不需要指定陣列的最大索引編
號, 因為編譯器會依照後面大括弧內元素個數,
自動決定此陣列的長度:
102
陣列的宣告與使用
 如果需要知道陣列的長度時,
可以使用 『陣列
名稱.Length』 來取得。下面範例會找出陣列
中所有數字的最大值, 您可以看到取得陣列長
度的方法,並且如何使用 for 迴圈針對每一個元
素進行處理:
103
陣列的宣告與使用
104
陣列的宣告與使用
105
二維陣列
 以下是宣告二維陣列的語法:
 二維陣列的宣告範例如下:
106
二維陣列
 也可以使用下面語法,
在宣告二維陣列時直接
設定各元素的值:
 上面定義了一個
2 x 3 的二維陣列, 各元素的值
如下:
107
二維陣列
 二維陣列的使用方式與一維陣列相同,
所以此
處不再贅述。此外, 除了二維陣列外, 您也可以
依照上述格式定義三維、四維. . .等多維陣列。
108
foreach 迴圈
 當需要針對陣列中每一個元素進行處理時,
通
常我們都會使用 for 迴圈來取出元素。不過為
了讓這樣的工作更有效率, C# 提供了另一個
foreach 迴圈, 可以更加方便地處理陣列。以下
是 foreach 迴圈的語法:
109
foreach 迴圈
 使用
foreach 迴圈時, 元素變數的內容便是陣
列中每一元素的值, 所以只要在動作敘述中直
接處理元素變數即可。因為元素變數代表陣列
每一元素,所以元素變數的資料型別必須與陣列
元素相同。
 以下範例即是用 foreach 迴圈列出陣列每一元
素:
110
foreach 迴圈
111
foreach 迴圈
第
13 〜16 行的 foreach 迴圈如果改用 for 迴
圈來設計, 其程式碼將如下:
 兩相比較後可以看到,
for 迴圈必須先取得陣列
長度來定義迴圈, 然後迴圈內必須逐一使用索
引數字存取各元素, 使用上不若 fore ach 迴圈
方便易用。
112
foreach 迴圈
與
for 迴圈相同, foreach 迴圈中的元素變數除
了使用時順便宣告外, 也可以事先設定, 這樣就
能直接使用。另外, 3-28 頁介紹的 break 與
continue 敘述也可以使用於 foreach 迴圈。
113
3-7 程序
 隨著程式越寫越龐大之後,
您可能會發現很多
功能相同的運算式、流程控制. . .等一再地被
重複使用。此時便可以將這些重複的程式碼寫
成程序(Procedure), 即可供程式隨時呼叫, 這
樣便不需要重複地放置相同的程式碼。此外,
這樣修改時也會更加容易, 只要修改程序即可,
不用逐一到程式各個地方去改。
114
定義程序的語法
 定義程序的語法如下:
 存取層級常見的設定有
public 、private 、
protected...等, 用來設定這個程序是否可以被
其他類別存取, 存取層級是可以忽略的項目, 請
先不要設定, 此部分將於下一節再加以說明。
115
定義程序的語法
 程序內的動作執行完畢後,
可以使用 return 敘
述提供回傳值給呼叫者。如果不需要回傳值,
可以設定『回傳值的資料型別』為 void, 並且
省略 return敘述。我們將先說明沒有回傳值的
狀況, 下面範例示範程序最基本的定義方法:
116
定義程序的語法
 上面定義了一個名為
hello 的程序, 所以在程式
中只要使用 "hello();", 就可以輸出 "Hello
World!" 字串。如果您想要傳遞一些參數給程
序, 則可如下定義:
117
定義程序的語法
 上面
printsum 程序中定義了兩個整數參數:
num1 與 num2, 當您在程式中使用
"printsum(3, 6);" 呼叫該程序時, 3 會被指定
給 num1 變數, 6 則被指定給num2 變數, 所以
您就可以在 printsum 程序中針對 num1 、
num2 變數進行處理。
118
定義程序的語法
 定義程序時,
請小心程序內不可以再定義其他
程序。您可能已經注意到,本章前面程式放置的
Page_Load 區段其實就是一個程序, 所以當您
要定義或其他程序時, 應該如下撰寫:
119
定義程序的語法
120
程序的回傳值
 程序可以使用
return 將值回傳給呼叫它的程序,
此時必須明確定義回傳值將會使用的資料型別。
下面範例為您示範程序回傳值的方法:
121
程序的回傳值
122
變數的有效範圍
在
C# 中, 可以在任何需要之處宣告變數, 但是
每一變數宣告之後並非隨處可用。C# 有一套
規則定義變數能夠被使用的範圍, 稱為變數的
有效範圍 (Scope)。
 凡是在程序內宣告的變數, 稱為區域變數, 只有
在該程序內才可以存取,至於在外層宣告的變數,
則可以由內層的各程序存取。下面例子使用
Sub1與 Sub2 兩個程序說明變數的有效範圍:
123
變數的有效範圍
124
變數的有效範圍
 上面
Var1 與 Var2 都是在程序外層所宣告的變
數, 故 SubA 與 SubB 皆可存取這兩個變數, 而
SubA 將 Var1 的值更改為 2, 所以如果 SubB
讀取 Var1 取得的變數值會是 2 。
125
變數的有效範圍
SubA 內部又宣告了一次 Var2 變數,
此時 Var2 這個名稱對於SubA 而言是一個剛剛
才宣告的新區域變數, 與外層宣告的 Var2 是兩
個完全不一樣的變數。所以當 SubA 設定 Var2
等於 2 時, 存取的是自己的區域變數,而後面
SubB 讀取 Var2 時, 取得的變數值則會是 1。
 至於 Var3 是 SubA 宣告的區域變數, 所以
SubB 將無法存取 Var3 裡面的值。以下是依照
上面例子實際寫成的程式:
 不過因為
126
變數的有效範圍
127
變數的有效範圍
128
變數的有效範圍
129
事件處理程序
 事件處理程序
(Event-Handling Procedure) 是
一種特殊的程序, 所謂的事件(Event) 是通知程
式有重要事情發生的信號, 例如頁面載入、滑
鼠點選...等, 當這些事件發生時, 就會自動觸發
相對應的程序, 該程序便稱為事件處理程序。
下面是觸發事件處理程序的示意圖:
130
事件處理程序
131
事件處理程序
 因此只要在網頁中為各種事件撰寫對應的事件
處理程序, 即可在各事件發生時進行處理。例
如前面我們經常使用的 Pa ge_Loa d 程序就是
一個事件處理程序, 會在網頁載入時自動被呼
叫。ASP.NET 中還有許多其他的事件處理程
序, 我們會在隨後章節遇到各種狀況時, 再行為
您介紹。
132
3-8 類別與物件
是一個物件導向的架構, 本節將為您
說明在 C# 中, 如何使用類別與物件。
 ASP.NET
133
類別與物件
 如果以現實生活的汽車來比擬,
類別 (Class) 就
像是汽車的設計藍圖, 藍圖內會定義好汽車外
觀、馬力...等規格, 而物件 (Object) 就是根據
藍圖製作出來的一台台汽車, 每台汽車都具有
相似的規格, 但是在顏色、內裝、音響配備. . .
等卻又各有不同。
134
類別與物件
 由此可知,
當我們在物件導向的架構內設計程
式時, 必須先有類別, 然後使用類別來產生需要
的物件。同一類別產生的物件具有相同屬性
(Property)與方法 (Method), 但是每一物件都是
獨立的個體, 可以各自具有不同屬性值,並且可
以自行運用其方法產生不同的結果。
135
類別與物件
是一個物件導向的架構, 因此所有的
網頁, 或是網頁上的按鈕、文字框、圖片. . .等
全部都是物件。當然使用這些物件前, 必須先
定義好類別。不過 ASP.NET 已經貼心地為我
們定義好常用的類別, 建立網頁檔案時也會自
動產生必要的類別, 所以在 ASP.NET 架構下撰
寫物件導向程式是一件非常輕鬆的事情。
 ASP.NET
136
類別與物件
 類別具有封裝
(Encapsulation) 與繼承 (Inheritance) 等特性, 封裝是指將類別的屬性與行為
都包裝在其中, 只對外公開一些操作資料的方
法, 就像電視內部是被裝封起來的, 一般人只能
使用遙控器來操控一樣。
137
類別與物件
 至於繼承則可以讓類別間共用相似的定義,
並
且整理成一個體系。例如現在已經有一個普通
手機的類別, 當要製作照相手機時, 只要 『繼
承』 普通手機的類別, 然後加上照相或其他需
要的功能即可, 不需要重複去設計電池、按鈕...
等相同的地方。所以 『繼承』 可以讓程式設
計更快速方便, 整個程式也會更簡潔。
138
定義類別的語法
 因為 ASP.NET
已經內建許多常用類別, 並且會
自動產生需要的類別, 所以撰寫 ASP.NET 程式
時, 很少需要自己定義類別, 故本節不詳細說明
類別的定義語法。宣告類別時, 主要會有以下
定義:
139
定義類別的語法
 因為類別具有封裝的特性,
所以必須用存取層
級來定義類別、屬性、行為等是否可以被外部
存取。一般常用的存取層級有 public、private、protected,分別代表可公開、私有完全不公
開、只允許同一類別或衍生的類別存取。關於
詳細的存取層級說明, 請參考線上說明中 『存
取範圍層級(C# 參考)』 段落。
140
定義類別的語法
 類別的屬性其實就是
3-2 節提到的變數, 例如
汽車類別可以定義一個Gas 屬性, 用來存放剩
餘油量。類別的方法便是其可以執行的程序,
定義方法時, 必須使用 3-7 節介紹的程序語法。
下面範例定義一個 Car 類別:
141
定義類別的語法
142
定義與使用物件
 瞭解如何定義類別後,
將繼續說明如何使用類
別來建立物件, 其語法如下:
 建立物件之後,
可以使用 "物件.屬性" 與 "物件.
方法()" 來存取屬性與方法。下面範例使用前面
定義的 Car 類別建立 mycar 物件, 並且存取其
屬性與方法:
143
3-9 命名空間與 .NET Framework 通
用類別/元件
 前面為您介紹了許多
C# 的變數、運算式、流
程控制...等, 除了這些 C#的語法外, .NET
Framework 其實還提供許多類別與元件, 本節
將說明如何在C# 中使用 .NET Framework 通
用類別/ 元件。
144
命名空間 - .NET Framework 類別/
元件的分類方式
 當程式架構逐漸龐大,
類別與元件越來越多之
後, 可能會面臨混淆與雜亂的問題。為了解決
這個問題, .NET 提供了命名空間 (Namespace)
來協助分類。
145
命名空間 - .NET Framework 類別/
元件的分類方式
 命名空間的分類方式類似於檔案系統的資料夾,
例如 C 槽裡面有 Windows資料夾放置系統檔
案, 有 Program Files 資料夾存放應用程式檔
案, 而且Program Files 資料夾內還會有許多子
資料夾供每個應用程式使用。
 因此以資料夾分類後, 檔案就不會凌亂放置, 而
使用命名空間分類之後, 也能讓類別與元件明
確地分類或分層。
146
命名空間 - .NET Framework 類別/
元件的分類方式
 在線上說明的
『.NET Framework 類別庫』
段落中, 可以找到完整的 .NET Framework 類
別與元件, 您可以看到其種類與數量相當多, 必
須使用命名空間來分門別類。所以使用 .NET
Framework 類別與元件前, 必須先瞭解如何存
取命名空間。
147
命名空間 - .NET Framework 類別/
元件的分類方式
 當您要使用命名空間下的類別或元件等項目,
必須使用完整名稱來存取命名空間內的類別、
元件, 其形式為 『命名空間1.命名空間2.類別
或元件』,命名空間可以有很多層, 命名空間各
層與類別元件之間都是以點 (.) 來分隔:
148
命名空間 - .NET Framework 類別/
元件的分類方式
 除了使用完整名稱以外,
也可以先匯入命名空
間, 即可直接使用命名空間內的類別。如果您
使用 ASP.NET 的單一檔案模式, 可以在 aspx
檔案最前面如下匯入命名空間:
149
命名空間 - .NET Framework 類別/
元件的分類方式
 如果使用程式碼後置模式,
可以在 aspx.cs 檔
案的最前面, 使用 using 敘述匯入命名空間:
150
命名空間 - .NET Framework 類別/
元件的分類方式
 當匯入多個命名空間時,
請小心這些命名空間
是否有重複的名稱。例如n1 與 n2 命名空間內
同時有 cls 類別, 當您同時匯入這兩個命名空
間後, 若直接使用 c ls 類別, 便會因為無法區別
而造成錯誤, 此時您必須使用完整名稱(如
n1.cls) 來使用 cls 類別。
151
使用.NET Framework 類別或元件
 前面曾經提到
.NET Framework 類別與元件分
門別類地放置於各命名空間下, 所以除了預設
的 System 命名空間下的類別與元件可以直接
存取以外,若要使用其他命名空間的 .NET
Framework 類別或元件, 必須以完整名稱或是
先匯入該命名空間才能順利使用。
 下面範例將以 System.IO 命名空間下 Path 類
別的 GetTempFileName() 方法, 在磁碟上建立
一個具唯一性的暫存檔案, 然後傳回該檔案的
完整路徑:
152
使用.NET Framework 類別或元件
153
使用.NET Framework 類別或元件
 上面程式第
1 行如果不先匯入 System.IO, 則
後面第 11 行必須便必須以
System.IO.Path.GetTempFileName() 才能建
立並取得暫存檔。
154
常用的.NET Framework 命名空間
 下表列出部分常用的
.NET Framework 類別與
元件所屬的命名空間, 以方便您查閱或尋找元
件:
155
常用的.NET Framework 命名空間
156
常用的.NET Framework 命名空間
在
.NET Framework 中, 有一種特殊的集合
( Collection ) 類別, 可以用來產生集合。
 集合可以視為一種特殊的陣列, 我們可以將一
組相關的項目放置於集合, 將其視為單一的集
合物件。
 集合與陣列兩者相比較, 集合調整長度的方式
較簡單且效率較好, 可以隨意新增或刪減其中
的元素, 不像陣列必須顧慮元素個數是否超過
長度, 另外集合裡面還可以放置不同型別的元
素。隨後章節遇到使用集合的控制項時, 會再
說明如何新增、移除與管理集合內的元素。
157
3-10 使用插入程式碼片段的功能快速
撰寫程式
 前面介紹了很多
C# 的語法有時候寫程式時,
可能會突然忘記某些語法應該怎麼寫, 此時可
以使用 VWD 的 『插入程式碼片段』 的功能,
幫我們輸入語法:
158
使用插入程式碼片段的功能快速撰
寫程式
159
使用插入程式碼片段的功能快速撰
寫程式
160
使用插入程式碼片段的功能快速撰
寫程式
161