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