第五章 方法 -...

60
第五章 方法 5.1 結構化程式設計 5.2 方法的簡介 5.6 陣列間參數的傳遞方式 5.3 亂數類別的使用 5.5 參數的傳遞方式 備註:可依進度點選小節 5.4 方法的使用 5.7 遞迴 5.8 多載

Upload: others

Post on 12-Oct-2019

11 views

Category:

Documents


0 download

TRANSCRIPT

第五章 方法

5.1 結構化程式設計

5.2 方法的簡介 5.6 陣列間參數的傳遞方式

5.3 亂數類別的使用

5.5 參數的傳遞方式

備註:可依進度點選小節

5.4 方法的使用

5.7 遞迴

5.8 多載

Visual C# 2008從零開始 第五章第五章第五章第五章 方法方法方法方法

2

5.1 5.1 5.1 5.1 結構化程式設計結構化程式設計結構化程式設計結構化程式設計

開發較大應用程式的過程中

程式設計人員和使用者彼此溝通不良

�使得開發出的應用程式滿意度降低。

因在開發過程發生未察覺錯誤

�降低使用者對該應用程式的品質信賴度。

對開發完成的應用程式測試不正確或文件說明

不完整和明確

�影響該應用程式日後維護。

設計大型的應用程式若能朝「結構化」去設計,

就能避免上述事情的發生。

Visual C# 2008從零開始 第五章第五章第五章第五章 方法方法方法方法

3

結構化程式設計結構化程式設計結構化程式設計結構化程式設計 (Structure Programming Design)

是指程式具有是指程式具有是指程式具有是指程式具有「「「「由上而下程式設計由上而下程式設計由上而下程式設計由上而下程式設計」」」」的精神及具模組化的精神及具模組化的精神及具模組化的精神及具模組化

設計概念設計概念設計概念設計概念。。。。

由上而下程式設計由上而下程式設計由上而下程式設計由上而下程式設計(Top-Down Programming Design)

是一種逐步細緻化的設計觀念是一種逐步細緻化的設計觀念是一種逐步細緻化的設計觀念是一種逐步細緻化的設計觀念,,,,它具有層次性它具有層次性它具有層次性它具有層次性,,,,將程式將程式將程式將程式

按照性能細分成多個單元按照性能細分成多個單元按照性能細分成多個單元按照性能細分成多個單元,,,,再將每個單元細分成各個獨再將每個單元細分成各個獨再將每個單元細分成各個獨再將每個單元細分成各個獨

立的模組立的模組立的模組立的模組,,,,模組間儘量避免相依性模組間儘量避免相依性模組間儘量避免相依性模組間儘量避免相依性,,,,使得整個程式的製使得整個程式的製使得整個程式的製使得整個程式的製

作簡單化作簡單化作簡單化作簡單化。。。。

設計一個完整的程式設計一個完整的程式設計一個完整的程式設計一個完整的程式,,,,就好像蓋房子一樣就好像蓋房子一樣就好像蓋房子一樣就好像蓋房子一樣。。。。

設計程式亦如此設計程式亦如此設計程式亦如此設計程式亦如此。。。。

Visual C# 2008從零開始 第五章第五章第五章第五章 方法方法方法方法

4

下圖是由頂端的主程式開始規劃下圖是由頂端的主程式開始規劃下圖是由頂端的主程式開始規劃下圖是由頂端的主程式開始規劃,,,,逐步往下層逐步往下層逐步往下層逐步往下層

設計設計設計設計,,,,層次分明有條理且易於了解層次分明有條理且易於了解層次分明有條理且易於了解層次分明有條理且易於了解,,,,減少程式減少程式減少程式減少程式

發生邏輯錯誤發生邏輯錯誤發生邏輯錯誤發生邏輯錯誤。。。。

此種設計觀念就是此種設計觀念就是此種設計觀念就是此種設計觀念就是「「「「由上而下程式設計由上而下程式設計由上而下程式設計由上而下程式設計」」」」

Visual C# 2008從零開始 第五章第五章第五章第五章 方法方法方法方法

5

模組化程式設計模組化程式設計模組化程式設計模組化程式設計 (Modular Programming Design)

分析問題時分析問題時分析問題時分析問題時,,,,由大而小由大而小由大而小由大而小,,,,由上而下由上而下由上而下由上而下,,,,將應用程式將應用程式將應用程式將應用程式

切割成若干模組切割成若干模組切割成若干模組切割成若干模組。。。。

若模組太大可再細分小模組若模組太大可再細分小模組若模組太大可再細分小模組若模組太大可再細分小模組,,,,使每個模組成為具使每個模組成為具使每個模組成為具使每個模組成為具

獨立功能的程序或函式獨立功能的程序或函式獨立功能的程序或函式獨立功能的程序或函式

C# 是物件導向語言是物件導向語言是物件導向語言是物件導向語言,,,,一般都將函式稱為一般都將函式稱為一般都將函式稱為一般都將函式稱為「「「「方法方法方法方法」」」」

(Method)。。。。

每個模組允許各自獨立分工撰寫和測試每個模組允許各自獨立分工撰寫和測試每個模組允許各自獨立分工撰寫和測試每個模組允許各自獨立分工撰寫和測試,,,,可減輕可減輕可減輕可減輕

程式設計者負擔且易維護和降低開發成本程式設計者負擔且易維護和降低開發成本程式設計者負擔且易維護和降低開發成本程式設計者負擔且易維護和降低開發成本。。。。

Visual C# 2008從零開始 第五章第五章第五章第五章 方法方法方法方法

6

模組與模組間模組與模組間模組與模組間模組與模組間 是透過是透過是透過是透過 來傳遞來傳遞來傳遞來傳遞。。。。

由於模組分開獨立撰寫由於模組分開獨立撰寫由於模組分開獨立撰寫由於模組分開獨立撰寫,,,,不同的應用程式可共用不同的應用程式可共用不同的應用程式可共用不同的應用程式可共用

提昇生產力提昇生產力提昇生產力提昇生產力。。。。

本章介紹的方法本章介紹的方法本章介紹的方法本章介紹的方法(或稱函式或稱函式或稱函式或稱函式)都可視為都可視為都可視為都可視為 。。。。

一個製作好的模組一個製作好的模組一個製作好的模組一個製作好的模組,,,,使用者只要給予輸入值使用者只要給予輸入值使用者只要給予輸入值使用者只要給予輸入值,,,,不必不必不必不必

瞭解模組內的如何運作瞭解模組內的如何運作瞭解模組內的如何運作瞭解模組內的如何運作,,,,便可輸出結果便可輸出結果便可輸出結果便可輸出結果,,,,有如各式有如各式有如各式有如各式

各樣的積木各樣的積木各樣的積木各樣的積木,,,,每塊積木相當於一個模組每塊積木相當於一個模組每塊積木相當於一個模組每塊積木相當於一個模組,,,,使用者可使用者可使用者可使用者可

依不同需求組出不同的東西出來依不同需求組出不同的東西出來依不同需求組出不同的東西出來依不同需求組出不同的東西出來。。。。

Visual C# 2008從零開始 第五章第五章第五章第五章 方法方法方法方法

7

任何一個程式的流程不外乎由任何一個程式的流程不外乎由任何一個程式的流程不外乎由任何一個程式的流程不外乎由

循序結構循序結構循序結構循序結構、、、、選擇結構選擇結構選擇結構選擇結構(if…else…、、、、switch…),,,,重複結構重複結構重複結構重複結構

(for…、、、、do…while)等程式區塊組合而成等程式區塊組合而成等程式區塊組合而成等程式區塊組合而成。。。。

程式流程保持一進一出的基本架構程式流程保持一進一出的基本架構程式流程保持一進一出的基本架構程式流程保持一進一出的基本架構,,,,因而增加程式的因而增加程式的因而增加程式的因而增加程式的

可讀性可讀性可讀性可讀性。。。。

在結構化程式設計在結構化程式設計在結構化程式設計在結構化程式設計,,,,無論在規劃程式階段或編寫程式無論在規劃程式階段或編寫程式無論在規劃程式階段或編寫程式無論在規劃程式階段或編寫程式

階段都注重由上而下設計和模組化的精神階段都注重由上而下設計和模組化的精神階段都注重由上而下設計和模組化的精神階段都注重由上而下設計和模組化的精神,,,,使得程式使得程式使得程式使得程式

層次分明層次分明層次分明層次分明、、、、可讀性高可讀性高可讀性高可讀性高、、、、易分工編寫易分工編寫易分工編寫易分工編寫、、、、易除錯與維護易除錯與維護易除錯與維護易除錯與維護。。。。

Visual C# 2008從零開始 第五章第五章第五章第五章 方法方法方法方法

8

5.2 方法的簡介方法的簡介方法的簡介方法的簡介

在撰寫較大程式中在撰寫較大程式中在撰寫較大程式中在撰寫較大程式中,,,,有些具有某種特定功能的程式有些具有某種特定功能的程式有些具有某種特定功能的程式有些具有某種特定功能的程式

區塊會在程式中多次重複出現區塊會在程式中多次重複出現區塊會在程式中多次重複出現區塊會在程式中多次重複出現,,,,使得程式看起來使得程式看起來使得程式看起來使得程式看起來

冗長和不具結構化冗長和不具結構化冗長和不具結構化冗長和不具結構化,,,,C# 允許將這些程式區塊單獨允許將這些程式區塊單獨允許將這些程式區塊單獨允許將這些程式區塊單獨

編寫成一個方法編寫成一個方法編寫成一個方法編寫成一個方法(或稱函式或稱函式或稱函式或稱函式)並賦予方法一個名稱並賦予方法一個名稱並賦予方法一個名稱並賦予方法一個名稱,,,,

程式中需要時才進行呼叫程式中需要時才進行呼叫程式中需要時才進行呼叫程式中需要時才進行呼叫。。。。

方法符合模組化程式設計的精神方法符合模組化程式設計的精神方法符合模組化程式設計的精神方法符合模組化程式設計的精神。。。。

將這些小模組交給不同程式設計師將這些小模組交給不同程式設計師將這些小模組交給不同程式設計師將這些小模組交給不同程式設計師,,,,同時進行編寫同時進行編寫同時進行編寫同時進行編寫

程式碼程式碼程式碼程式碼,,,,最後只要透過最上層的主程式將各個方法最後只要透過最上層的主程式將各個方法最後只要透過最上層的主程式將各個方法最後只要透過最上層的主程式將各個方法

連結起來就成為一個完整的大系統連結起來就成為一個完整的大系統連結起來就成為一個完整的大系統連結起來就成為一個完整的大系統。。。。

Visual C# 2008從零開始 第五章第五章第五章第五章 方法方法方法方法

9

將程式開始執行的起點稱為將程式開始執行的起點稱為將程式開始執行的起點稱為將程式開始執行的起點稱為「「「「主程式主程式主程式主程式」」」」

在主控台應用程式下在主控台應用程式下在主控台應用程式下在主控台應用程式下 C# 程式起點是程式起點是程式起點是程式起點是 Main()方法方法方法方法

Main()方法方法方法方法算算算算是主程式是主程式是主程式是主程式。。。。

一般的方法是不會自一般的方法是不會自一般的方法是不會自一般的方法是不會自動動動動執行執行執行執行,,,,只有在只有在只有在只有在被被被被主程式或主程式或主程式或主程式或

另另另另一個方法呼叫一個方法呼叫一個方法呼叫一個方法呼叫(Call)時時時時,,,,一般的方法才會一般的方法才會一般的方法才會一般的方法才會被被被被執行執行執行執行。。。。

Visual C# 2008從零開始 第五章第五章第五章第五章 方法方法方法方法

10

程式中使用方法來建構程式碼的優點程式中使用方法來建構程式碼的優點程式中使用方法來建構程式碼的優點程式中使用方法來建構程式碼的優點::::

1. 方法可將大的應用程式分成若干不連方法可將大的應用程式分成若干不連方法可將大的應用程式分成若干不連方法可將大的應用程式分成若干不連續續續續的邏輯單元的邏輯單元的邏輯單元的邏輯單元

由多由多由多由多人人人人同時進行編碼同時進行編碼同時進行編碼同時進行編碼,,,,可提高程式設計可提高程式設計可提高程式設計可提高程式設計效率效率效率效率。。。。

2. 相同功能的程式相同功能的程式相同功能的程式相同功能的程式片片片片段編寫成方法段編寫成方法段編寫成方法段編寫成方法,,,,只需寫一次只需寫一次只需寫一次只需寫一次,,,,

可在同個程式中多可在同個程式中多可在同個程式中多可在同個程式中多處處處處使用使用使用使用;;;;也也也也可不需可不需可不需可不需做做做做太多太多太多太多修改修改修改修改

或不用或不用或不用或不用修改修改修改修改,,,,套套套套用用用用到其到其到其到其它的程式共用它的程式共用它的程式共用它的程式共用,,,,開發開發開發開發省省省省時時時時

省省省省力力力力。。。。

3. 可可可可縮短縮短縮短縮短程式長程式長程式長程式長度度度度,,,,簡化程式邏輯簡化程式邏輯簡化程式邏輯簡化程式邏輯,,,,有有有有助助助助提高程式提高程式提高程式提高程式

的可讀性的可讀性的可讀性的可讀性。。。。

4. 採採採採用物件導向程式設計用物件導向程式設計用物件導向程式設計用物件導向程式設計,,,,不同功能的程式單元獨立不同功能的程式單元獨立不同功能的程式單元獨立不同功能的程式單元獨立

成為某個成為某個成為某個成為某個類別類別類別類別的方法的方法的方法的方法,,,,使得較易除錯和維護使得較易除錯和維護使得較易除錯和維護使得較易除錯和維護。。。。

Visual C# 2008從零開始 第五章第五章第五章第五章 方法方法方法方法

11

程式設計者應程式需求而自行定程式設計者應程式需求而自行定程式設計者應程式需求而自行定程式設計者應程式需求而自行定義義義義的的的的使用者自使用者自使用者自使用者自訂訂訂訂方法方法方法方法,,,,

在在在在 C# 常常常常用可分成下用可分成下用可分成下用可分成下列兩列兩列兩列兩種種種種::::

1. 事事事事件件件件處處處處理函式理函式理函式理函式 (Event-Handling Function)

依依依依據據據據使用者使用者使用者使用者動動動動作或程式作或程式作或程式作或程式項目所觸項目所觸項目所觸項目所觸發發發發 (Trigger)的的的的事事事事件件件件,,,,

此時會此時會此時會此時會去去去去執行執行執行執行該事該事該事該事件的件的件的件的事事事事件件件件處處處處理函式理函式理函式理函式,,,,例例例例如在如在如在如在btnOk鈕鈕鈕鈕

的上按一下的上按一下的上按一下的上按一下,,,,會會會會觸觸觸觸發發發發btnOk鈕鈕鈕鈕的的的的Click事事事事件件件件,,,,此時會執此時會執此時會執此時會執

行行行行btnOk_Click() 事事事事件件件件處處處處理函式理函式理函式理函式。。。。

2. 方法方法方法方法(Method)

程式設計者自程式設計者自程式設計者自程式設計者自己己己己定定定定義義義義的程式模組的程式模組的程式模組的程式模組,,,,可傳可傳可傳可傳回回回回一個結果值或一個結果值或一個結果值或一個結果值或

不傳不傳不傳不傳回回回回值值值值,,,,一般都稱為函式一般都稱為函式一般都稱為函式一般都稱為函式,,,,因因因因C# 為物件導向語言為物件導向語言為物件導向語言為物件導向語言,,,,

在此在此在此在此我們我們我們我們稱為稱為稱為稱為方法方法方法方法。。。。

Visual C# 2008從零開始 第五章第五章第五章第五章 方法方法方法方法

12

方法適用於進行重複或共用的工作方法適用於進行重複或共用的工作方法適用於進行重複或共用的工作方法適用於進行重複或共用的工作。。。。

例如常用的計算例如常用的計算例如常用的計算例如常用的計算、、、、文字和控制項的操作及文字和控制項的操作及文字和控制項的操作及文字和控制項的操作及

資料庫作業資料庫作業資料庫作業資料庫作業。。。。

可從程式碼中許多不同的位置呼叫方法可從程式碼中許多不同的位置呼叫方法可從程式碼中許多不同的位置呼叫方法可從程式碼中許多不同的位置呼叫方法,,,,

可將方法當作應用程式的建置區塊可將方法當作應用程式的建置區塊可將方法當作應用程式的建置區塊可將方法當作應用程式的建置區塊。。。。

Visual C# 2008從零開始 第五章第五章第五章第五章 方法方法方法方法

13

5.3 亂數類別的使用亂數類別的使用亂數類別的使用亂數類別的使用

「「「「內建類別內建類別內建類別內建類別」」」」是廠商將一些經常用到的數學公式是廠商將一些經常用到的數學公式是廠商將一些經常用到的數學公式是廠商將一些經常用到的數學公式、、、、字串處理字串處理字串處理字串處理、、、、

日期運算以及方法的資料型別直接建構在該程式語言的系統內日期運算以及方法的資料型別直接建構在該程式語言的系統內日期運算以及方法的資料型別直接建構在該程式語言的系統內日期運算以及方法的資料型別直接建構在該程式語言的系統內

系統內建類別系統內建類別系統內建類別系統內建類別

以以以以 C# 來說就可用來說就可用來說就可用來說就可用 .Net Framework 內建類別內建類別內建類別內建類別,,,,程式設計者程式設計者程式設計者程式設計者

不必了解這些類別以及物件方法內部的寫法不必了解這些類別以及物件方法內部的寫法不必了解這些類別以及物件方法內部的寫法不必了解這些類別以及物件方法內部的寫法,,,,只要給予參數只要給予參數只要給予參數只要給予參數,,,,

直接呼叫物件的方法名稱直接呼叫物件的方法名稱直接呼叫物件的方法名稱直接呼叫物件的方法名稱,,,,便可得到輸出結果便可得到輸出結果便可得到輸出結果便可得到輸出結果。。。。

在在在在 .Net Framework 提供的常用內建類別包括提供的常用內建類別包括提供的常用內建類別包括提供的常用內建類別包括::::

亂數類別亂數類別亂數類別亂數類別、、、、數學類別數學類別數學類別數學類別、、、、字串類別以及日期類別字串類別以及日期類別字串類別以及日期類別字串類別以及日期類別。。。。

Visual C# 2008從零開始 第五章第五章第五章第五章 方法方法方法方法

14

命命命命名名名名空空空空間間間間 (NameSpace)

由於由於由於由於 .Net Framework 所所所所提提提提供供供供的的的的類別很類別很類別很類別很多多多多,,,,程式在程式在程式在程式在

編編編編譯譯譯譯時時時時,,,,若將若將若將若將全部類別全部載全部類別全部載全部類別全部載全部類別全部載入入入入,,,,對對對對程式的執行程式的執行程式的執行程式的執行

效率影響很效率影響很效率影響很效率影響很大大大大,,,,因此將因此將因此將因此將所所所所有有有有類別類別類別類別分分分分類類類類,,,,每個分每個分每個分每個分類類類類

給予名稱稱為給予名稱稱為給予名稱稱為給予名稱稱為「「「「命命命命名名名名空空空空間間間間」」」」。。。。

命命命命名名名名空空空空間是間是間是間是微軟微軟微軟微軟 .Net 用來將相用來將相用來將相用來將相關型別集關型別集關型別集關型別集合在一起的合在一起的合在一起的合在一起的

一種一種一種一種命命命命名名名名機制機制機制機制,,,,以以以以避免不同組件間發生名稱避免不同組件間發生名稱避免不同組件間發生名稱避免不同組件間發生名稱衝突衝突衝突衝突。。。。

譬譬譬譬如如如如::::常常常常用的用的用的用的 Console 類別類別類別類別、、、、String 類別類別類別類別、、、、Random

類別類別類別類別…等都等都等都等都放放放放在在在在 System 這個這個這個這個命命命命名名名名空空空空間中間中間中間中,,,,程式中若程式中若程式中若程式中若

有使用有使用有使用有使用到到到到這些這些這些這些類別類別類別類別,,,,必必必必須須須須用用用用 using 敘述引敘述引敘述引敘述引用用用用 System

命命命命名名名名空空空空間間間間。。。。

寫法寫法寫法寫法:::: using System;

Visual C# 2008從零開始 第五章第五章第五章第五章 方法方法方法方法

15

Random 類別類別類別類別可用來產生可用來產生可用來產生可用來產生亂數亂數亂數亂數。。。。

宣告宣告宣告宣告和和和和建建建建立方式立方式立方式立方式::::

1. 先宣告先宣告先宣告先宣告一個名稱為一個名稱為一個名稱為一個名稱為 ranObj 是指向是指向是指向是指向 Random

型別型別型別型別的物件的物件的物件的物件參考參考參考參考。。。。

2. 使用使用使用使用 new 來來來來初初初初始化始化始化始化建建建建立立立立 ranObj 物件物件物件物件,,,,即建即建即建即建立立立立

ranObj 為為為為 Random 類別類別類別類別的物件的物件的物件的物件實體實體實體實體。。。。

寫法寫法寫法寫法::::Random ranObj = new Random();

Visual C# 2008從零開始 第五章第五章第五章第五章 方法方法方法方法

16

使用 Random 類別提供的 Next() 方法產生某個範圍的亂數值。

方式:

1產生介於 0~2,147,483,647(=231-1)間的亂數值並指定給 ranNum 整數變數:

int ranNum = ranObj.Next();

2產生 0~4 間的亂數值並指定給 ranNum 整數變數,寫法:

int ranNum = ranObj.Next(5);

3產生 7~99 間的亂數值並指定給 ranNum 整數變數,寫法:

int ranNum = ranObj.Next(7, 100);

Visual C# 2008從零開始 第五章第五章第五章第五章 方法方法方法方法

17

試使用試使用試使用試使用 for 迴圈迴圈迴圈迴圈與與與與 Random 類別類別類別類別來產生來產生來產生來產生兩兩兩兩組組組組1~10 之之之之間間間間

的的的的五五五五個個個個亂數亂數亂數亂數,,,,觀觀觀觀察兩察兩察兩察兩次執行結果是次執行結果是次執行結果是次執行結果是否否否否一樣一樣一樣一樣????

第一次執行結果 第二次執行結果

Visual C# 2008從零開始 第五章第五章第五章第五章 方法方法方法方法

18

// FileName : RndObj.sln

01 static void Main(string[] args)

02 {

03 Random rndObj = new Random();

04 // 一組一組一組一組 1-10 的五個亂數的五個亂數的五個亂數的五個亂數

05 Console.Write("== Pass1::::");

06 for (int k = 1; k <= 5; k++)

07 {

08 Console.Write(" {0}", rndObj .Next (1, 11));

09 }

10 Console.WriteLine();

11 //第二組第二組第二組第二組 1-10 的五個亂數的五個亂數的五個亂數的五個亂數

12 Console.Write("== Pass2::::");

13 for (int k = 1; k <= 5; k++)

14 {

15 Console.Write(" {0}", rndObj.Next(1, 11));

16 }

17 Console.Read();

18 }

Visual C# 2008從零開始 第五章第五章第五章第五章 方法方法方法方法

19

5.4 方法的使用方法的使用方法的使用方法的使用

C# 為物件導向的程式語言為物件導向的程式語言為物件導向的程式語言為物件導向的程式語言,,,,方法必方法必方法必方法必須放須放須放須放在在在在類別類別類別類別內內內內不可獨立在不可獨立在不可獨立在不可獨立在類別類別類別類別外外外外,,,,和傳統結構化程式設計不同和傳統結構化程式設計不同和傳統結構化程式設計不同和傳統結構化程式設計不同。。。。

使用使用使用使用靜態靜態靜態靜態方法並不需方法並不需方法並不需方法並不需建建建建立立立立類別類別類別類別的物件的物件的物件的物件實體即實體即實體即實體即可可可可直接直接直接直接呼叫使用呼叫使用呼叫使用呼叫使用

迴圈迴圈迴圈迴圈和方法和方法和方法和方法(或稱函式或稱函式或稱函式或稱函式)的應用的應用的應用的應用範圍範圍範圍範圍不相同不相同不相同不相同::::����迴圈迴圈迴圈迴圈每次執行時每次執行時每次執行時每次執行時,,,,可在程式相同的可在程式相同的可在程式相同的可在程式相同的地地地地方重複方重複方重複方重複執行某一段程式碼執行某一段程式碼執行某一段程式碼執行某一段程式碼

����方法可在程式中任何方法可在程式中任何方法可在程式中任何方法可在程式中任何地地地地方方方方被被被被重複呼叫使用重複呼叫使用重複呼叫使用重複呼叫使用。。。。

方法需在程式中方法需在程式中方法需在程式中方法需在程式中先先先先定定定定義義義義,,,,再透過呼叫方式來執行再透過呼叫方式來執行再透過呼叫方式來執行再透過呼叫方式來執行該該該該方法方法方法方法。。。。

Visual C# 2008從零開始 第五章第五章第五章第五章 方法方法方法方法

20

5.4.1 方法的定義方法的定義方法的定義方法的定義

定定定定義義義義方法主要是方法主要是方法主要是方法主要是先先先先為為為為該該該該方法設定方法設定方法設定方法設定::::����傳傳傳傳回回回回值的值的值的值的資料型別資料型別資料型別資料型別����為方法為方法為方法為方法命命命命名名名名|����指定呼叫指定呼叫指定呼叫指定呼叫該該該該方法時方法時方法時方法時到底到底到底到底要傳入多少個要傳入多少個要傳入多少個要傳入多少個引數引數引數引數����同時同時同時同時宣告宣告宣告宣告這些這些這些這些引數引數引數引數的的的的資料型別資料型別資料型別資料型別

以以以以上都在定上都在定上都在定上都在定義義義義方法方法方法方法第第第第一行一行一行一行敘述敘述敘述敘述中中中中書書書書寫寫寫寫,,,,接著接著接著接著在在在在該該該該方法方法方法方法的主的主的主的主體體體體內撰寫相內撰寫相內撰寫相內撰寫相關關關關程式碼程式碼程式碼程式碼。。。。基本語法基本語法基本語法基本語法::::

Visual C# 2008從零開始 第五章第五章第五章第五章 方法方法方法方法

21

方法的命名方法的命名方法的命名方法的命名::::

比比比比照照照照識別項識別項識別項識別項命命命命名規名規名規名規則則則則::::

����引數串列超引數串列超引數串列超引數串列超過一個過一個過一個過一個以以以以上上上上,,,,中間使用中間使用中間使用中間使用逗號隔逗號隔逗號隔逗號隔開開開開。。。。

����每個方法和每個方法和每個方法和每個方法和變數變數變數變數一樣都有一個一樣都有一個一樣都有一個一樣都有一個資料型別資料型別資料型別資料型別,,,,該資料該資料該資料該資料

型別型別型別型別是是是是放放放放在方法名稱在方法名稱在方法名稱在方法名稱前面前面前面前面,,,,由它來由它來由它來由它來決決決決定傳定傳定傳定傳回回回回值的值的值的值的

資料型別資料型別資料型別資料型別。。。。

����若在方法若在方法若在方法若在方法前前前前加加加加 static,,,,即即即即將方法定將方法定將方法定將方法定義義義義為為為為靜態靜態靜態靜態方法方法方法方法,,,,

靜態靜態靜態靜態方法不用方法不用方法不用方法不用建建建建立立立立類別類別類別類別的物件的物件的物件的物件實體即實體即實體即實體即可可可可以以以以呼叫使用呼叫使用呼叫使用呼叫使用。。。。

����若方法若方法若方法若方法之前省略之前省略之前省略之前省略static 即即即即為為為為類別類別類別類別的方法的方法的方法的方法,,,,類別類別類別類別的方法的方法的方法的方法

必必必必須須須須要要要要建建建建立物件立物件立物件立物件實體實體實體實體才能呼叫才能呼叫才能呼叫才能呼叫。。。。

Visual C# 2008從零開始 第五章第五章第五章第五章 方法方法方法方法

22

方法是一組方法是一組方法是一組方法是一組以以以以 { 開開開開頭頭頭頭而而而而以以以以 } 結結結結束所束所束所束所組成的程式區塊組成的程式區塊組成的程式區塊組成的程式區塊。。。。

每當方法每當方法每當方法每當方法被被被被呼叫時呼叫時呼叫時呼叫時,,,,會會會會跳到跳到跳到跳到方法後方法後方法後方法後面面面面的的的的第第第第一個可一個可一個可一個可執行的執行的執行的執行的陳述陳述陳述陳述式式式式,,,,開始往下執行開始往下執行開始往下執行開始往下執行,,,,當當當當碰到碰到碰到碰到 } 右右右右大大大大括號括號括號括號或或或或 return 陳述陳述陳述陳述式才式才式才式才離離離離開方法開方法開方法開方法,,,,接著接著接著接著再再再再返回原返回原返回原返回原呼叫呼叫呼叫呼叫|陳述陳述陳述陳述式式式式處處處處。。。。

方法內方法內方法內方法內引數串列引數串列引數串列引數串列寫法寫法寫法寫法::::

Visual C# 2008從零開始 第五章第五章第五章第五章 方法方法方法方法

23

實引數和虛引數實引數和虛引數實引數和虛引數實引數和虛引數::::

將呼叫陳述式的引數串列稱為將呼叫陳述式的引數串列稱為將呼叫陳述式的引數串列稱為將呼叫陳述式的引數串列稱為「「「「實引數實引數實引數實引數」」」」(Actual Argument)

將被呼叫方法的引數串列稱為虛引數將被呼叫方法的引數串列稱為虛引數將被呼叫方法的引數串列稱為虛引數將被呼叫方法的引數串列稱為虛引數(Dummy Argument)。。。。

參考呼叫參考呼叫參考呼叫參考呼叫

虛引數串列的引數資料型別前面虛引數串列的引數資料型別前面虛引數串列的引數資料型別前面虛引數串列的引數資料型別前面設定為設定為設定為設定為 ref。。。。此時實引數和此時實引數和此時實引數和此時實引數和

虛引數會佔用相同記憶位址虛引數會佔用相同記憶位址虛引數會佔用相同記憶位址虛引數會佔用相同記憶位址,,,,表示除了允許接收由原呼叫表示除了允許接收由原呼叫表示除了允許接收由原呼叫表示除了允許接收由原呼叫

陳述式對應的實引數外陳述式對應的實引數外陳述式對應的實引數外陳述式對應的實引數外,,,,離開時也可以將值傳回給原呼叫離開時也可以將值傳回給原呼叫離開時也可以將值傳回給原呼叫離開時也可以將值傳回給原呼叫

敘述對應的引數敘述對應的引數敘述對應的引數敘述對應的引數。。。。

傳值呼叫傳值呼叫傳值呼叫傳值呼叫

若虛引數資料型別前面若虛引數資料型別前面若虛引數資料型別前面若虛引數資料型別前面沒有加沒有加沒有加沒有加 ref。。。。表該引數只能接收由表該引數只能接收由表該引數只能接收由表該引數只能接收由

原呼叫陳述式對應的引數原呼叫陳述式對應的引數原呼叫陳述式對應的引數原呼叫陳述式對應的引數,,,,但離開方法時無法將值傳回但離開方法時無法將值傳回但離開方法時無法將值傳回但離開方法時無法將值傳回。。。。

Visual C# 2008從零開始 第五章第五章第五章第五章 方法方法方法方法

24

傳入值和傳回值傳入值和傳回值傳入值和傳回值傳入值和傳回值

傳入值傳入值傳入值傳入值

是指當呼叫方法時是指當呼叫方法時是指當呼叫方法時是指當呼叫方法時,,,,可透過可透過可透過可透過引數串列引數串列引數串列引數串列來來來來取取取取得由呼叫得由呼叫得由呼叫得由呼叫

該該該該方法的方法的方法的方法的陳述陳述陳述陳述式式式式處所處所處所處所傳入的傳入的傳入的傳入的常數常數常數常數、、、、變數變數變數變數或運或運或運或運算算算算式等式等式等式等

引數引數引數引數當作當作當作當作初初初初值值值值。。。。

傳傳傳傳回回回回值值值值

是指方法將執行結果傳是指方法將執行結果傳是指方法將執行結果傳是指方法將執行結果傳回回回回給給給給原原原原呼叫程式的值呼叫程式的值呼叫程式的值呼叫程式的值,,,,方法方法方法方法

使用使用使用使用 return 敘述敘述敘述敘述來傳來傳來傳來傳回回回回值值值值。。。。語法語法語法語法::::

return(運運運運算算算算式式式式)

若方法的傳若方法的傳若方法的傳若方法的傳回回回回值設為值設為值設為值設為 void,,,,表表表表呼叫呼叫呼叫呼叫該該該該方法方法方法方法沒沒沒沒傳傳傳傳回回回回值值值值。。。。

Visual C# 2008從零開始 第五章第五章第五章第五章 方法方法方法方法

25

return 敘述敘述敘述敘述

使用使用使用使用 return 陳述陳述陳述陳述式來指定傳式來指定傳式來指定傳式來指定傳回回回回值值值值,,,,當此當此當此當此陳述陳述陳述陳述式執行式執行式執行式執行

完完完完畢畢畢畢立立立立即即即即將控將控將控將控制權制權制權制權傳傳傳傳回回回回給給給給原原原原呼叫程式呼叫程式呼叫程式呼叫程式,,,,接接接接在在在在 return

後後後後面面面面的的的的陳述陳述陳述陳述式都不會執行式都不會執行式都不會執行式都不會執行。。。。

Visual C# 2008從零開始 第五章第五章第五章第五章 方法方法方法方法

26

方法使用上注意事項方法使用上注意事項方法使用上注意事項方法使用上注意事項::::

方法除可寫在方法除可寫在方法除可寫在方法除可寫在 Main() 主程式主程式主程式主程式前面前面前面前面,,,,也也也也可將方法可將方法可將方法可將方法

寫在寫在寫在寫在 Main() 主程式的後主程式的後主程式的後主程式的後面面面面

方法必方法必方法必方法必須須須須在在在在類別類別類別類別內內內內。。。。

程式中使用方法有程式中使用方法有程式中使用方法有程式中使用方法有限制限制限制限制,,,,方法內不允許再定方法內不允許再定方法內不允許再定方法內不允許再定義義義義

另另另另一個方法一個方法一個方法一個方法。。。。

方法方法方法方法前前前前可加可加可加可加 public、、、、private 等來設定方法有等來設定方法有等來設定方法有等來設定方法有效效效效

的的的的存取權限存取權限存取權限存取權限。。。。

若若若若宣告宣告宣告宣告為為為為 public表示該表示該表示該表示該方法的方法的方法的方法的存取範圍沒存取範圍沒存取範圍沒存取範圍沒有有有有限制限制限制限制。。。。

若若若若宣告宣告宣告宣告為為為為 private 該該該該方法只能在方法只能在方法只能在方法只能在目前目前目前目前的的的的類別類別類別類別中使用中使用中使用中使用。。。。

Visual C# 2008從零開始 第五章第五章第五章第五章 方法方法方法方法

27

5.4.2 方法的呼叫方法的呼叫方法的呼叫方法的呼叫

當靜態方法定義完畢當靜態方法定義完畢當靜態方法定義完畢當靜態方法定義完畢,,,,呼叫的敘述與靜態方法在呼叫的敘述與靜態方法在呼叫的敘述與靜態方法在呼叫的敘述與靜態方法在

同類別內同類別內同類別內同類別內,,,,便可用下面方式呼叫便可用下面方式呼叫便可用下面方式呼叫便可用下面方式呼叫

將上節定義的方法稱為將上節定義的方法稱為將上節定義的方法稱為將上節定義的方法稱為被呼叫的程式被呼叫的程式被呼叫的程式被呼叫的程式。。。。

下列呼叫方法的敘述稱為下列呼叫方法的敘述稱為下列呼叫方法的敘述稱為下列呼叫方法的敘述稱為呼叫陳述式呼叫陳述式呼叫陳述式呼叫陳述式。。。。

語法語法語法語法1::::

變數名稱變數名稱變數名稱變數名稱 = 方法名稱方法名稱方法名稱方法名稱([引數串列引數串列引數串列引數串列]); // 傳回一個結果值傳回一個結果值傳回一個結果值傳回一個結果值

volume=compute(r);

volume=20+compute(r+3);

語法語法語法語法2::::

方法名稱方法名稱方法名稱方法名稱([引數串列引數串列引數串列引數串列]);// 不傳回值不傳回值不傳回值不傳回值

Visual C# 2008從零開始 第五章第五章第五章第五章 方法方法方法方法

28

在撰寫呼叫在撰寫呼叫在撰寫呼叫在撰寫呼叫陳述陳述陳述陳述式和式和式和式和被被被被呼叫程式間呼叫程式間呼叫程式間呼叫程式間做引數做引數做引數做引數傳遞時注傳遞時注傳遞時注傳遞時注意意意意::::

����實引數實引數實引數實引數和和和和虛引數虛引數虛引數虛引數的個的個的個的個數數數數要相同要相同要相同要相同

����兩兩兩兩者間者間者間者間對對對對應應應應引數引數引數引數的的的的資料型別資料型別資料型別資料型別要一要一要一要一致致致致

實引數實引數實引數實引數允許使用允許使用允許使用允許使用常常常常值值值值、、、、變數變數變數變數、、、、運運運運算算算算式式式式、、、、陣列陣列陣列陣列、、、、結構結構結構結構、、、、

物件當物件當物件當物件當引數引數引數引數。。。。

虛引數虛引數虛引數虛引數不允許使用不允許使用不允許使用不允許使用常常常常值值值值、、、、運運運運算算算算式當式當式當式當引數引數引數引數,,,,允許使用允許使用允許使用允許使用

變數變數變數變數、、、、陣列陣列陣列陣列、、、、結構結構結構結構、、、、物件當物件當物件當物件當引數引數引數引數。。。。

Visual C# 2008從零開始 第五章第五章第五章第五章 方法方法方法方法

29

呼叫方法呼叫方法呼叫方法呼叫方法1 -呼叫同呼叫同呼叫同呼叫同類別之靜態類別之靜態類別之靜態類別之靜態方法方法方法方法

呼叫時可直接撰寫靜態方法名稱再傳入引數呼叫時可直接撰寫靜態方法名稱再傳入引數呼叫時可直接撰寫靜態方法名稱再傳入引數呼叫時可直接撰寫靜態方法名稱再傳入引數。。。。

下面寫法呼叫下面寫法呼叫下面寫法呼叫下面寫法呼叫 add() 靜態方法靜態方法靜態方法靜態方法,,,,將實引數將實引數將實引數將實引數 1 傳給傳給傳給傳給虛引數虛引數虛引數虛引數 a,,,,

實引數實引數實引數實引數 6 傳入給傳入給傳入給傳入給虛引數虛引數虛引數虛引數 b,,,,最後透過最後透過最後透過最後透過 return 將將將將 a+b 結果傳回結果傳回結果傳回結果傳回

原呼叫敘述原呼叫敘述原呼叫敘述原呼叫敘述等號左邊的等號左邊的等號左邊的等號左邊的 sum 變數變數變數變數。。。。

Visual C# 2008從零開始 第五章第五章第五章第五章 方法方法方法方法

30

呼叫方法呼叫方法呼叫方法呼叫方法 2 -呼叫不同呼叫不同呼叫不同呼叫不同類別之靜態類別之靜態類別之靜態類別之靜態方法方法方法方法,,,,

呼叫時需撰寫完整的類別名稱及呼叫時需撰寫完整的類別名稱及呼叫時需撰寫完整的類別名稱及呼叫時需撰寫完整的類別名稱及 public 公用型靜態方法名稱公用型靜態方法名稱公用型靜態方法名稱公用型靜態方法名稱,,,,

接著再傳入方法的引數即可接著再傳入方法的引數即可接著再傳入方法的引數即可接著再傳入方法的引數即可。。。。

下面寫法呼叫下面寫法呼叫下面寫法呼叫下面寫法呼叫 Class1 類別的類別的類別的類別的 add() 靜態方法並將靜態方法並將靜態方法並將靜態方法並將實引數實引數實引數實引數 1 傳給傳給傳給傳給

虛引數虛引數虛引數虛引數a,,,,實引數實引數實引數實引數 6 傳入給虛引數傳入給虛引數傳入給虛引數傳入給虛引數 b,,,,最後透過最後透過最後透過最後透過 return 敘述敘述敘述敘述

將將將將 a+b 結果傳回給原呼叫敘述等號左邊的結果傳回給原呼叫敘述等號左邊的結果傳回給原呼叫敘述等號左邊的結果傳回給原呼叫敘述等號左邊的 sum 變數變數變數變數。。。。

Visual C# 2008從零開始 第五章第五章第五章第五章 方法方法方法方法

31

呼叫方法呼叫方法呼叫方法呼叫方法 3 -呼叫不同呼叫不同呼叫不同呼叫不同類別之類別之類別之類別之方法方法方法方法

首先必須首先必須首先必須首先必須用用用用 new 關鍵字建立該類別的物件實體關鍵字建立該類別的物件實體關鍵字建立該類別的物件實體關鍵字建立該類別的物件實體,,,,接著透過接著透過接著透過接著透過

「「「「物件物件物件物件.方法名稱方法名稱方法名稱方法名稱()」」」」來呼叫即可來呼叫即可來呼叫即可來呼叫即可。。。。

下面寫法先建立下面寫法先建立下面寫法先建立下面寫法先建立 c 屬於屬於屬於屬於 Class1 類別的物件類別的物件類別的物件類別的物件,,,,接著呼叫接著呼叫接著呼叫接著呼叫 c物件物件物件物件的的的的

add 方法並傳入虛引數方法並傳入虛引數方法並傳入虛引數方法並傳入虛引數1和和和和6給實引數給實引數給實引數給實引數a和和和和b,,,,最後透過最後透過最後透過最後透過 return

將將將將 a+b 的結果傳回給原呼叫敘述等號左邊的的結果傳回給原呼叫敘述等號左邊的的結果傳回給原呼叫敘述等號左邊的的結果傳回給原呼叫敘述等號左邊的 sum 變數變數變數變數。。。。

Visual C# 2008從零開始 第五章第五章第五章第五章 方法方法方法方法

32

試寫一個方法試寫一個方法試寫一個方法試寫一個方法,,,,名稱為名稱為名稱為名稱為 Compute。。。。先先先先由由由由鍵盤鍵盤鍵盤鍵盤輸入輸入輸入輸入半徑半徑半徑半徑

(radius),,,,再將再將再將再將 radius 實引數實引數實引數實引數傳給傳給傳給傳給 Compute()方法的方法的方法的方法的

r 虛引數虛引數虛引數虛引數,,,,計計計計算算算算出出出出體體體體積後積後積後積後,,,,再將結果由方法本再將結果由方法本再將結果由方法本再將結果由方法本身身身身傳傳傳傳回回回回給給給給

volume,,,,最後再最後再最後再最後再顯示顯示顯示顯示輸入的輸入的輸入的輸入的半徑半徑半徑半徑和計和計和計和計算算算算出的出的出的出的體體體體積積積積。。。。

Visual C# 2008從零開始 第五章第五章第五章第五章 方法方法方法方法

33

Step1 宣告 PI 靜態變數

靜態方法內只能存取靜態變數靜態方法內只能存取靜態變數靜態方法內只能存取靜態變數靜態方法內只能存取靜態變數(即靜態欄位即靜態欄位即靜態欄位即靜態欄位),,,,

將圓周率將圓周率將圓周率將圓周率 PI 宣告成宣告成宣告成宣告成 private 私有靜態變數私有靜態變數私有靜態變數私有靜態變數,,,,

因此因此因此因此 PI 私有靜態變數需在私有靜態變數需在私有靜態變數需在私有靜態變數需在Main()方法前面或後面宣告方法前面或後面宣告方法前面或後面宣告方法前面或後面宣告。。。。

寫法寫法寫法寫法::::

private static double PI= 3.1416;

Step2 定義 Compute() 方法

在在在在 Main() 方法前面或後面定義下列方法前面或後面定義下列方法前面或後面定義下列方法前面或後面定義下列 Compute()方法用來計算方法用來計算方法用來計算方法用來計算

並傳回圓的體積並傳回圓的體積並傳回圓的體積並傳回圓的體積,,,,寫法寫法寫法寫法::::

static double Compute(double r)

{

return (4.0 / 3.0 * PI * r * r * r);

}

Visual C# 2008從零開始 第五章第五章第五章第五章 方法方法方法方法

34

Step3 撰寫撰寫撰寫撰寫 Main() 方法主程式方法主程式方法主程式方法主程式

在在在在Main()方法內宣告相關變數方法內宣告相關變數方法內宣告相關變數方法內宣告相關變數,,,,volume 存放體積存放體積存放體積存放體積,,,,

radius 存放半徑存放半徑存放半徑存放半徑,,,,為求體積正確為求體積正確為求體積正確為求體積正確,,,,變數資料型別變數資料型別變數資料型別變數資料型別

設為設為設為設為double。。。。

Main()主程式寫法主程式寫法主程式寫法主程式寫法::::

static void Main(string[] args)

{double volume, radius;Console.Write(" 請輸入半徑請輸入半徑請輸入半徑請輸入半徑(公分公分公分公分) : ");

radius = double.Parse(Console.ReadLine());//呼叫呼叫呼叫呼叫Compute靜態方法並傳入半徑靜態方法並傳入半徑靜態方法並傳入半徑靜態方法並傳入半徑,,,,最後再將結果傳回給最後再將結果傳回給最後再將結果傳回給最後再將結果傳回給volume

volume = Compute(radius);

Console.WriteLine();Console.WriteLine(" 半徑半徑半徑半徑 = {0}公分公分公分公分 體積體積體積體積 = {1} 立方公分立方公分立方公分立方公分",

radius, volume);Console.Read();

}

Visual C# 2008從零開始 第五章第五章第五章第五章 方法方法方法方法

35

// FileName : Medhod1.sln

01 //宣告靜態成員變數宣告靜態成員變數宣告靜態成員變數宣告靜態成員變數PI(即靜態欄位即靜態欄位即靜態欄位即靜態欄位)

02 private static double PI = 3.1416;

03

04 //Compute靜態方法可算出圓的體積靜態方法可算出圓的體積靜態方法可算出圓的體積靜態方法可算出圓的體積

05 static double Compute(double r)

06 {

07 // 靜態方法才能使用靜態變數靜態方法才能使用靜態變數靜態方法才能使用靜態變數靜態方法才能使用靜態變數

08 return (4.0 / 3.0 * PI * r * r * r);

09 }

10

Visual C# 2008從零開始 第五章第五章第五章第五章 方法方法方法方法

36

11 static void Main(string[] args)

12 {

13 double volume, radius;

14 Console.Write(" 請輸入半徑請輸入半徑請輸入半徑請輸入半徑(公分公分公分公分) : ");

15 radius = double.Parse(Console.ReadLine());

16 // 呼叫呼叫呼叫呼叫Compute靜態方法並傳入半徑靜態方法並傳入半徑靜態方法並傳入半徑靜態方法並傳入半徑,,,,最後再將結果傳回給最後再將結果傳回給最後再將結果傳回給最後再將結果傳回給volume

17 volume = Compute(radius);

18 Console.WriteLine();

19 Console.WriteLine(" 半徑半徑半徑半徑 = {0}公分公分公分公分 體積體積體積體積 = {1} 立方公分立方公分立方公分立方公分", radius, volume);

21 Console.Read();

22 }

Visual C# 2008從零開始 第五章第五章第五章第五章 方法方法方法方法

37

使用名稱為使用名稱為使用名稱為使用名稱為CheckYear()的方法的方法的方法的方法,,,,此方法傳回型別為此方法傳回型別為此方法傳回型別為此方法傳回型別為 void,,,,由鍵盤由鍵盤由鍵盤由鍵盤輸入西元多少年輸入西元多少年輸入西元多少年輸入西元多少年(year),,,,採傳值呼叫方式將採傳值呼叫方式將採傳值呼叫方式將採傳值呼叫方式將 year 變數傳給變數傳給變數傳給變數傳給 CheckYear()方法中的方法中的方法中的方法中的 y 整數變數整數變數整數變數整數變數,,,,將將將將 y 經判斷是否為閏年經判斷是否為閏年經判斷是否為閏年經判斷是否為閏年,,,,若是印出若是印出若是印出若是印出””””閏年閏年閏年閏年””””訊息訊息訊息訊息,,,,否則印出否則印出否則印出否則印出””””平年平年平年平年””””訊息訊息訊息訊息。。。。閏年計算規則閏年計算規則閏年計算規則閏年計算規則「「「「能被能被能被能被4整除且不被整除且不被整除且不被整除且不被100整除或能被整除或能被整除或能被整除或能被400整除的年份整除的年份整除的年份整除的年份」」」」

if (y % 4 == 0 && y % 100 !== 0 || y % 400 == 0) {

// 閏年閏年閏年閏年}else{

// 平年平年平年平年}

Visual C# 2008從零開始 第五章第五章第五章第五章 方法方法方法方法

38

FileName : Medhod2.sln

01 //呼叫呼叫呼叫呼叫CheckYear靜態方法靜態方法靜態方法靜態方法,,,,可判斷並顯示傳入的可判斷並顯示傳入的可判斷並顯示傳入的可判斷並顯示傳入的y年份是閏年還是平年年份是閏年還是平年年份是閏年還是平年年份是閏年還是平年

02 static void CheckYear (int y)

03 {

04 if (y % 4 == 0 && y % 100 != 0 || y % 400 == 0)

05 {

06 Console.WriteLine("\n=== {0} 年年年年為為為為閏年閏年閏年閏年! ===", y);

07 }

08 else

09 {

10 Console.WriteLine("\n=== {0} 年年年年為為為為平年平年平年平年! ===", y);

11 }

12 }

13

Visual C# 2008從零開始 第五章第五章第五章第五章 方法方法方法方法

39

14 static void Main(string[] args)15 {16 int year; 17 Console.Write("請輸入年份請輸入年份請輸入年份請輸入年份:");

1819 try20 {2122 year = int.Parse(Console.ReadLine());2324 CheckYear(year);25 }26 catch (Exception ex) 27 {28 Console.WriteLine(ex.Message );29 }30 Console.Read();31 }

Visual C# 2008從零開始 第五章第五章第五章第五章 方法方法方法方法

40

5.5 參數的傳遞方式參數的傳遞方式參數的傳遞方式參數的傳遞方式

方法都是使用者應程式需求而自方法都是使用者應程式需求而自方法都是使用者應程式需求而自方法都是使用者應程式需求而自訂訂訂訂的函式的函式的函式的函式。。。。

方法必方法必方法必方法必須須須須透過呼叫才能執行透過呼叫才能執行透過呼叫才能執行透過呼叫才能執行。。。。

參數參數參數參數傳遞傳遞傳遞傳遞

是指自是指自是指自是指自訂訂訂訂方法方法方法方法(或稱函式或稱函式或稱函式或稱函式)被被被被呼叫開始執行呼叫開始執行呼叫開始執行呼叫開始執行前前前前,,,,應指定應指定應指定應指定

哪哪哪哪些些些些實引數實引數實引數實引數要要要要從從從從呼叫呼叫呼叫呼叫陳述陳述陳述陳述式傳入式傳入式傳入式傳入被被被被呼叫方法的呼叫方法的呼叫方法的呼叫方法的虛引數虛引數虛引數虛引數

及及及及哪哪哪哪些些些些虛引數虛引數虛引數虛引數在在在在離離離離開自開自開自開自訂訂訂訂方法要傳方法要傳方法要傳方法要傳回回回回給呼叫給呼叫給呼叫給呼叫陳述陳述陳述陳述式的式的式的式的

實引數實引數實引數實引數。。。。

C# 提提提提供兩供兩供兩供兩種方式種方式種方式種方式做參數做參數做參數做參數傳遞傳遞傳遞傳遞::::

1. 傳值呼叫傳值呼叫傳值呼叫傳值呼叫(Call By Value)

2. 參考呼叫參考呼叫參考呼叫參考呼叫(Call By Reference)

Visual C# 2008從零開始 第五章第五章第五章第五章 方法方法方法方法

41

C# 中中中中,,,,在在在在被被被被呼叫方法呼叫方法呼叫方法呼叫方法引數串列引數串列引數串列引數串列中的中的中的中的虛引數虛引數虛引數虛引數及呼叫及呼叫及呼叫及呼叫陳述陳述陳述陳述式式式式

的的的的實引數前面實引數前面實引數前面實引數前面可指定或可指定或可指定或可指定或省略省略省略省略 ref 關鍵字關鍵字關鍵字關鍵字。。。。

若若若若省略省略省略省略 ref 關鍵字代表以關鍵字代表以關鍵字代表以關鍵字代表以傳值傳值傳值傳值 (By Value)方式來傳遞方式來傳遞方式來傳遞方式來傳遞引數引數引數引數

至至至至方法方法方法方法。。。。

若若若若虛引數型別之前虛引數型別之前虛引數型別之前虛引數型別之前加上加上加上加上ref關鍵字則以參考關鍵字則以參考關鍵字則以參考關鍵字則以參考 (By

Reference) 方式來傳遞方式來傳遞方式來傳遞方式來傳遞引數至引數至引數至引數至方法方法方法方法。。。。

以以以以傳值方式來傳遞傳值方式來傳遞傳值方式來傳遞傳值方式來傳遞引數屬引數屬引數屬引數屬於於於於數數數數值值值值型別型別型別型別(Value Type) 。。。。

以參考以參考以參考以參考方式來傳遞方式來傳遞方式來傳遞方式來傳遞引數屬引數屬引數屬引數屬於於於於參考型別參考型別參考型別參考型別 (Reference Type)。。。。

Visual C# 2008從零開始 第五章第五章第五章第五章 方法方法方法方法

42

5.5.1 傳值呼叫傳值呼叫傳值呼叫傳值呼叫傳值呼叫傳值呼叫傳值呼叫傳值呼叫是指當呼叫陳述式將實引數傳給虛引數只做傳入的動作是指當呼叫陳述式將實引數傳給虛引數只做傳入的動作是指當呼叫陳述式將實引數傳給虛引數只做傳入的動作是指當呼叫陳述式將實引數傳給虛引數只做傳入的動作。。。。

也就是說也就是說也就是說也就是說 C# 此時將虛引數視為此時將虛引數視為此時將虛引數視為此時將虛引數視為區域變數區域變數區域變數區域變數,,,,自動配置新的記憶位址自動配置新的記憶位址自動配置新的記憶位址自動配置新的記憶位址

給虛引數來存放實引數傳入的內容給虛引數來存放實引數傳入的內容給虛引數來存放實引數傳入的內容給虛引數來存放實引數傳入的內容。。。。

實引數和虛引數兩者在記憶體分別佔用實引數和虛引數兩者在記憶體分別佔用實引數和虛引數兩者在記憶體分別佔用實引數和虛引數兩者在記憶體分別佔用不同的記憶位址不同的記憶位址不同的記憶位址不同的記憶位址,,,,當虛引數當虛引數當虛引數當虛引數

在方法內資料有異動時在方法內資料有異動時在方法內資料有異動時在方法內資料有異動時,,,,並不會影響實引數的值並不會影響實引數的值並不會影響實引數的值並不會影響實引數的值。。。。

當離開自訂方法時當離開自訂方法時當離開自訂方法時當離開自訂方法時,,,,虛引數佔用的記憶體位址自動釋放虛引數佔用的記憶體位址自動釋放虛引數佔用的記憶體位址自動釋放虛引數佔用的記憶體位址自動釋放,,,,交還給系統交還給系統交還給系統交還給系統,,,,

當程式執行權返回到原呼叫的陳述式時當程式執行權返回到原呼叫的陳述式時當程式執行權返回到原呼叫的陳述式時當程式執行權返回到原呼叫的陳述式時,,,,實引數的內容仍維持實引數的內容仍維持實引數的內容仍維持實引數的內容仍維持

不變不變不變不變。。。。

用傳值方式來傳遞引數用傳值方式來傳遞引數用傳值方式來傳遞引數用傳值方式來傳遞引數,,,,表示該自訂方法無法變更實引數中表示該自訂方法無法變更實引數中表示該自訂方法無法變更實引數中表示該自訂方法無法變更實引數中

原呼叫程式碼裡的變數內容原呼叫程式碼裡的變數內容原呼叫程式碼裡的變數內容原呼叫程式碼裡的變數內容。。。。

C# 對參數傳遞預設採傳值呼叫對參數傳遞預設採傳值呼叫對參數傳遞預設採傳值呼叫對參數傳遞預設採傳值呼叫。。。。

Visual C# 2008從零開始 第五章第五章第五章第五章 方法方法方法方法

43

5.5.2 參考呼叫參考呼叫參考呼叫參考呼叫

所謂所謂所謂所謂「「「「參考參考參考參考呼叫呼叫呼叫呼叫」」」」是指當呼叫是指當呼叫是指當呼叫是指當呼叫陳述陳述陳述陳述式將式將式將式將實引數實引數實引數實引數傳給傳給傳給傳給

虛引數虛引數虛引數虛引數時時時時,,,,可可可可做做做做傳入和傳出的傳入和傳出的傳入和傳出的傳入和傳出的動動動動作作作作。。。。

也也也也就是就是就是就是說實引數說實引數說實引數說實引數和和和和虛引數兩虛引數兩虛引數兩虛引數兩者者者者參參參參用相同的用相同的用相同的用相同的記憶體位址記憶體位址記憶體位址記憶體位址

來來來來存放引數存放引數存放引數存放引數,,,,當當當當虛引數虛引數虛引數虛引數在方法內在方法內在方法內在方法內資料資料資料資料有有有有異動異動異動異動時時時時,,,,離離離離開開開開

自自自自訂訂訂訂方法時方法時方法時方法時,,,,虛引數虛引數虛引數虛引數解除解除解除解除參參參參用用用用,,,,但實引數仍繼續參但實引數仍繼續參但實引數仍繼續參但實引數仍繼續參用用用用,,,,

待待待待當程式執行當程式執行當程式執行當程式執行權返回到原權返回到原權返回到原權返回到原呼叫的呼叫的呼叫的呼叫的陳述陳述陳述陳述式時式時式時式時,,,,實引數實引數實引數實引數的的的的

內內內內容已容已容已容已是是是是異動異動異動異動過的過的過的過的資料資料資料資料,,,,這這這這表示參考表示參考表示參考表示參考呼叫是可呼叫是可呼叫是可呼叫是可以修改以修改以修改以修改

變數變數變數變數本本本本身身身身。。。。

引數做參考引數做參考引數做參考引數做參考呼叫時呼叫時呼叫時呼叫時,,,,虛引數虛引數虛引數虛引數及及及及實引數實引數實引數實引數的的的的資料型別之前資料型別之前資料型別之前資料型別之前

要加上要加上要加上要加上 ref 關鍵字關鍵字關鍵字關鍵字來來來來表示表示表示表示。。。。

Visual C# 2008從零開始 第五章第五章第五章第五章 方法方法方法方法

44

修改修改修改修改 Medhod2.sln 範例範例範例範例。。。。

試使用名稱為試使用名稱為試使用名稱為試使用名稱為 CheckYear() 方法方法方法方法,,,,由由由由鍵盤鍵盤鍵盤鍵盤輸入西元多少輸入西元多少輸入西元多少輸入西元多少年年年年

(year),,,,採採採採傳值呼叫方式將傳值呼叫方式將傳值呼叫方式將傳值呼叫方式將 year 變數變數變數變數傳給傳給傳給傳給 CheckYear()

方法中的方法中的方法中的方法中的 y 整整整整數變數數變數數變數數變數;;;;

採參考採參考採參考採參考呼叫使呼叫使呼叫使呼叫使實引數實引數實引數實引數 str1 和和和和虛引數虛引數虛引數虛引數 s1 佔佔佔佔相同相同相同相同記憶位址記憶位址記憶位址記憶位址。。。。

經判斷經判斷經判斷經判斷若若若若 y 為為為為閏年閏年閏年閏年,,,,則則則則指定指定指定指定s1(即即即即str1)傳傳傳傳回回回回””””閏年閏年閏年閏年””””訊息訊息訊息訊息,,,,

若是若是若是若是平年平年平年平年,,,,則則則則s1(即即即即str1)傳傳傳傳回回回回””””平年平年平年平年””””訊息訊息訊息訊息。。。。

Visual C# 2008從零開始 第五章第五章第五章第五章 方法方法方法方法

45

FileName : Medhod3.sln

01 // y01 // y01 // y01 // y虛引數採傳值呼叫虛引數採傳值呼叫虛引數採傳值呼叫虛引數採傳值呼叫,,,,s1s1s1s1虛引數採參考呼叫虛引數採參考呼叫虛引數採參考呼叫虛引數採參考呼叫

02 //s 102 //s 102 //s 102 //s 1虛引數與實引數會共用同一記憶空間虛引數與實引數會共用同一記憶空間虛引數與實引數會共用同一記憶空間虛引數與實引數會共用同一記憶空間

03 static void CheckYear(int y, ref string s1)

04 {

05 if (y % 4 == 0 && y % 100 != 0 || y % 400 == 0)

06 {

07 s1 = "閏年閏年閏年閏年! ";

08 }

09 else

10 {

11 s1 = "平年平年平年平年! ";

12 }

13 }

14

Visual C# 2008從零開始 第五章第五章第五章第五章 方法方法方法方法

46

15 static void Main(string[] args)

16 {17 int year;

18 string str1= "";18 Console.Write("請輸入年份請輸入年份請輸入年份請輸入年份 : ");

19 try

20 {21 year = int.Parse(Console.ReadLine());

22

23 CheckYear(year, ref str1);24 Console.WriteLine("\n=== {0}年為年為年為年為{1} === ", year, str1);

25 }

26 catch (Exception ex)27 {

28 Console.WriteLine(ex.Message);

29 }

30 Console.Read();31 }

Visual C# 2008從零開始 第五章第五章第五章第五章 方法方法方法方法

47

5.6 陣列間參數的傳遞方式陣列間參數的傳遞方式陣列間參數的傳遞方式陣列間參數的傳遞方式

方法間方法間方法間方法間引數引數引數引數的傳遞的傳遞的傳遞的傳遞,,,,除除除除常常常常值值值值、、、、變數變數變數變數外外外外,,,,還還還還可用可用可用可用陣列陣列陣列陣列、、、、

結構結構結構結構,,,,或物件來傳遞或物件來傳遞或物件來傳遞或物件來傳遞。。。。

若若若若引數引數引數引數是是是是陣列陣列陣列陣列,,,,單一個單一個單一個單一個陣列陣列陣列陣列元元元元素素素素可依需求可依需求可依需求可依需求採採採採傳值或傳值或傳值或傳值或參考參考參考參考

呼叫呼叫呼叫呼叫。。。。

物件或整個物件或整個物件或整個物件或整個陣列做參數陣列做參數陣列做參數陣列做參數傳遞必傳遞必傳遞必傳遞必須須須須使用使用使用使用參考參考參考參考呼叫呼叫呼叫呼叫。。。。

假假假假設設設設myAry 為一個整為一個整為一個整為一個整數陣列數陣列數陣列數陣列,,,,透過透過透過透過myMethod方法方法方法方法

作作作作參數參數參數參數傳遞傳遞傳遞傳遞。。。。其其其其寫法如下寫法如下寫法如下寫法如下::::

Visual C# 2008從零開始 第五章第五章第五章第五章 方法方法方法方法

48

1. 傳傳傳傳遞陣列元素遞陣列元素遞陣列元素遞陣列元素

Visual C# 2008從零開始 第五章第五章第五章第五章 方法方法方法方法

49

2. 傳遞整個傳遞整個傳遞整個傳遞整個陣列陣列陣列陣列

被被被被呼叫程式呼叫程式呼叫程式呼叫程式虛引數資料型別之虛引數資料型別之虛引數資料型別之虛引數資料型別之後必後必後必後必須須須須加上加上加上加上 [],,,,

原原原原呼叫呼叫呼叫呼叫陳述陳述陳述陳述式可式可式可式可直接直接直接直接設定設定設定設定陣列陣列陣列陣列名稱名稱名稱名稱即即即即可可可可。。。。

寫法寫法寫法寫法::::

Visual C# 2008從零開始 第五章第五章第五章第五章 方法方法方法方法

50

試寫一個將試寫一個將試寫一個將試寫一個將 ary1 整個整整個整整個整整個整數陣列數陣列數陣列數陣列傳給傳給傳給傳給 GetMin() 方法方法方法方法,,,,

接著即接著即接著即接著即可傳可傳可傳可傳回回回回 ary1 陣列陣列陣列陣列中的最小值中的最小值中的最小值中的最小值。。。。

Visual C# 2008從零開始 第五章第五章第五章第五章 方法方法方法方法

51

FileName : SendArray.sln

01 // GetMin()方法找出傳入的陣列中的最小值方法找出傳入的陣列中的最小值方法找出傳入的陣列中的最小值方法找出傳入的陣列中的最小值

02 static int GetMin(int[] tempAry)

03 {

04 int min = tempAry[0];

05

06 for (int i = 1; i <= tempAry.GetUpperBound(0); i++)

07 {

08 if (tempAry[i] < min)

09 {

10 min = tempAry[i];

11 }

12 }

13 return min;

14 }

15

Visual C# 2008從零開始 第五章第五章第五章第五章 方法方法方法方法

52

16 static void Main(string[] args)

17 {

18 //建立並初始化建立並初始化建立並初始化建立並初始化ary1陣列陣列陣列陣列

19 int[] ary1 = new int[] { 10, 88, 6, 34, 77 };

20 Console.Write("ary1陣列為陣列為陣列為陣列為->");

21 //逐一印出陣列中的每一個陣列元素逐一印出陣列中的每一個陣列元素逐一印出陣列中的每一個陣列元素逐一印出陣列中的每一個陣列元素

22 for (int i = 0; i <= ary1.GetUpperBound(0); i++)

23 {

24 Console.Write("{0} ", ary1[i]);

25 }

26 Console.WriteLine();

27 Console.WriteLine("\nary1陣列最小數為陣列最小數為陣列最小數為陣列最小數為::::{0}",GetMin(ary1) );

28 Console.Read();

29 }

Visual C# 2008從零開始 第五章第五章第五章第五章 方法方法方法方法

53

5.7 遞迴遞迴遞迴遞迴 (Recursive)

遞遞遞遞迴迴迴迴方法方法方法方法(或稱遞或稱遞或稱遞或稱遞迴迴迴迴函式函式函式函式)

是指方法中再呼叫自是指方法中再呼叫自是指方法中再呼叫自是指方法中再呼叫自己己己己本本本本身身身身就構成遞就構成遞就構成遞就構成遞迴迴迴迴。。。。

像像像像數學數學數學數學求階求階求階求階乘乘乘乘、、、、排列排列排列排列、、、、組合組合組合組合、、、、數列數列數列數列等都可使用等都可使用等都可使用等都可使用。。。。

撰寫遞撰寫遞撰寫遞撰寫遞迴迴迴迴方法時必方法時必方法時必方法時必須須須須在方法內有能在方法內有能在方法內有能在方法內有能離離離離開方法的開方法的開方法的開方法的

條件式條件式條件式條件式,,,,否則很容否則很容否則很容否則很容易易易易造造造造成無成無成無成無窮迴圈窮迴圈窮迴圈窮迴圈。。。。

Visual C# 2008從零開始 第五章第五章第五章第五章 方法方法方法方法

54

西元西元西元西元1202年義大利數學家費波年義大利數學家費波年義大利數學家費波年義大利數學家費波納納納納西西西西(Fibonacci)在在在在他他他他出出出出版版版版的的的的「「「「算盤算盤算盤算盤全全全全書書書書」」」」中中中中介紹介紹介紹介紹費波費波費波費波納納納納西數列西數列西數列西數列。。。。

該數列最前面兩該數列最前面兩該數列最前面兩該數列最前面兩項係項係項係項係數數數數都都都都為為為為1,,,,其它項係其它項係其它項係其它項係數數數數都都都都是由位於該是由位於該是由位於該是由位於該項係項係項係項係數前面數前面數前面數前面兩兩兩兩項係項係項係項係數相加數相加數相加數相加之之之之和和和和。。。。該數列該數列該數列該數列依序依序依序依序::::1、、、、1、、、、2、、、、3、、、、5、、、、8、、、、13、、、、21、、、、... 等以此類等以此類等以此類等以此類推推推推下下下下去去去去。。。。

當數字當數字當數字當數字越越越越大時大時大時大時,,,,將前將前將前將前項項項項數字除以數字除以數字除以數字除以緊緊緊緊接接接接其其其其後後後後之之之之數字數字數字數字,,,,比比比比值有值有值有值有逐漸向逐漸向逐漸向逐漸向0.618 收收收收斂斂斂斂。。。。此此此此比比比比率就是率就是率就是率就是「「「「黃金比黃金比黃金比黃金比率率率率」。」。」。」。

在大自在大自在大自在大自然植然植然植然植物的物的物的物的花瓣花瓣花瓣花瓣、、、、美美美美學學學學、、、、建建建建築築築築、、、、股票趨勢股票趨勢股票趨勢股票趨勢分分分分析析析析等等等等都看都看都看都看到到到到它它它它的的的的蹤蹤蹤蹤影影影影。。。。現現現現在就以此數列來撰寫一個遞在就以此數列來撰寫一個遞在就以此數列來撰寫一個遞在就以此數列來撰寫一個遞迴迴迴迴方法方法方法方法,,,,由鍵盤輸入一個正整數由鍵盤輸入一個正整數由鍵盤輸入一個正整數由鍵盤輸入一個正整數,,,,若輸若輸若輸若輸

入入入入8,,,,下下下下圖圖圖圖會會會會顯顯顯顯示出費波示出費波示出費波示出費波納納納納西數列的前西數列的前西數列的前西數列的前八八八八個個個個係係係係數數數數::::

Visual C# 2008從零開始 第五章第五章第五章第五章 方法方法方法方法

55

FileName : Recursive.sln

01 //定義定義定義定義Fib方法可傳回第方法可傳回第方法可傳回第方法可傳回第n個費波納西係數個費波納西係數個費波納西係數個費波納西係數

02 static int Fib(int n)

03 {

04 if (n == 1 || n == 2)

05 {

06 return 1;

07 }

08 else

09 {

10 return (Fib(n - 1) + Fib(n - 2));

11 }

12 }

13

Visual C# 2008從零開始 第五章第五章第五章第五章 方法方法方法方法

56

14 static void Main(string[] args)

15 {

16 int keyin;17 Console.Write("=== 請輸入欲列印到第幾個費波納西係數請輸入欲列印到第幾個費波納西係數請輸入欲列印到第幾個費波納西係數請輸入欲列印到第幾個費波納西係數 : ");

18 try

19 {20 keyin = int.Parse(Console.ReadLine());21 Console.WriteLine("\n=== 費波納西數列的係數為費波納西數列的係數為費波納西數列的係數為費波納西數列的係數為 : ");

22 Console.Write(" ");

23 for (int i = 1; i <= keyin; i++)

24 {25

26 Console.Write("{0} , ", Fib(i));

27 }28 }

29 catch (Exception ex)

30 {31 Console.WriteLine(ex.Message);

32 }33 Console.Read();34 }

Visual C# 2008從零開始 第五章第五章第五章第五章 方法方法方法方法

57

5.8 多載多載多載多載 (Overloading)

多載

是指多個方法(或函式)可以使用相同的名稱

是透過不同的引數串列個數及引數的資料型別

來加以區分。

Visual C# 2008從零開始 第五章第五章第五章第五章 方法方法方法方法

58

定定定定義兩義兩義兩義兩個相同名稱的個相同名稱的個相同名稱的個相同名稱的 GetMin()方法方法方法方法::::

����一個用來傳一個用來傳一個用來傳一個用來傳回兩回兩回兩回兩個整個整個整個整數數數數的最小的最小的最小的最小數數數數。。。。

����一個用來傳一個用來傳一個用來傳一個用來傳回回回回整整整整數陣列數陣列數陣列數陣列中的最小中的最小中的最小中的最小數數數數。。。。

Visual C# 2008從零開始 第五章第五章第五章第五章 方法方法方法方法

59

FileName : OverLoads.sln

01 // 傳回 a, b 中的最小數

02 static int GetMin(int a, int b)

03 {

04 return (a < b ? a : b);

05 }

06

Visual C# 2008從零開始 第五章第五章第五章第五章 方法方法方法方法

60

07 //傳回傳回傳回傳回b陣列中的最小數陣列中的最小數陣列中的最小數陣列中的最小數08 static int GetMin(int[] b)

09 {

10 int min = b[0];11 for (int i = 0; i <= b.GetUpperBound(0); i++)

12 {

13 if (min < b[i])14 {

15 min = b[i];

16 }

17 }18 return min;

19 }

20 // --------------------------------------------------------------------------------------21 static void Main(string[] args)

22 {23 Console.WriteLine("5, 7最小數為最小數為最小數為最小數為{0}::::", GetMin(5, 7));

24 int[] ary = new int[] { 25, 6, 899, 30 };25 Console.WriteLine("25, 6, 899, 3最小數為最小數為最小數為最小數為{0}::::", GetMin(ary));

26 Console.Read();27 }