練習 - 傳回方法的值和參數
- 18 分鐘
在上一個單元中,您使用「骰子」程式碼撰寫案例來說明具狀態 (執行個體) 和無狀態 (靜態) 方法之間的差異。 相同的案例可協助您了解呼叫方法的其他重要概念。 例如:
- 處理方法的傳回值。
- 方法參數以及將引數傳遞給方法。
- 選擇方法的多載版本。
傳回值
某些方法的設計是會在完成其功能後「安靜地」結束。 也就是不會在完成時傳回值。 這些方法稱為 Void 方法。
其他方法的設計則會在完成時傳回值。 傳回值通常是作業的結果。 傳回值是方法回頭向呼叫它的程式碼進行通訊的主要方式。
您看到 Random.Next() 方法傳回包含隨機產生數值的 int 型別。 不過,方法可以設計成傳回任何資料類型,甚至是另一個類別。 例如,類別 String 有些方法會傳回字串、有些方法會傳回整數,有些則傳回布林值。
呼叫傳回值的方法時,您通常會將傳回值指派給變數。 如此一來,您稍後就可以在程式碼中使用值。 在骰子案例中,您已將 Random.Next() 的傳回值指派給 roll 變數:
int roll = dice.Next(1, 7);
在某些情況下,您可能想要直接使用傳回值,而不需將它指派給變數。 例如,您可能會想要將傳回值列印到主控台,如下所示:
Console.WriteLine(dice.Next(1, 7));
即使方法傳回值,仍可在不使用傳回值的情況下呼叫方法。 例如,您可以呼叫方法來忽略傳回值,如下所示:
dice.Next(1, 7);
不過,忽略傳回值無意義。 您呼叫 Next() 方法的原因是您可以擷取下一個隨機值。
呼叫陳述式中的方法參數和引數
當您呼叫方法時,您可以傳入該方法將用來完成其工作的值。 這些值稱為引數。 方法會使用引數,將值指派給方法簽章中所定義的參數。 方法可能需要一或多個參數來完成其工作,或完全不使用任何參數。
備註
通常,'parameter' 和 'argument' 一詞會交替使用。 不過,'parameter' 是指在方法內使用的變數。 'argument' 是呼叫方法時傳遞的值。
大部分的方法都是設計來接受一或多個參數。 參數可以用來設定方法執行其工作的方式,或者它們可能會直接運作。 例如,Random.Next() 方法會使用入參數來設定傳回值的上限和下限。 不過,Console.WriteLine() 會直接將值列印至主控台,以使用參數。
方法會使用方法簽章來定義方法將接受的參數數目,以及每個參數的資料類型。 呼叫方法的編碼陳述式必須遵守方法簽章所指定的需求。 某些方法會提供該方法接受的參數數目和類型的選項。
當呼叫者呼叫方法時,它會為每個參數提供具體值,也稱為引數。 引數必須與參數類型相容。 不過,引數名稱 (如果在呼叫程式碼中使用) 不必與方法中定義的參數名稱相同。
請考慮下列程式碼:
Random dice = new Random();
int roll = dice.Next(1, 7);
Console.WriteLine(roll);
第一個程式碼行會建立名為 Random 的 dice 類別的執行個體。 第二個程式碼行使用 dice.Next(1, 7) 方法,將隨機值指派給名為 roll 的整數。 請注意,呼叫陳述式會提供兩個以 , 符號分隔的引數。
Next() 方法包含方法簽章,可接受類型為 int 的兩個參數。 這些參數可用來設定傳回之亂數的下限和上限。 最後一個程式碼行使用 Console.WriteLine() 方法,將 roll 的值列印到主控台。
傳遞至方法的引數必須與該方法所定義的對應參數一樣具有相同的資料類型。 如果您嘗試將類型錯誤的引數傳遞給方法,C# 編譯程式會攔截您的錯誤,並強制您在程式碼編譯和執行之前更新呼叫陳述式。。 類型檢查是 C# 和 .NET 用來防止終端使用者在執行時間發生錯誤的一種方式。
備註
雖然參數經常用到,但並非所有方法都需要參數才能完成其工作。 例如,Console 類別包含不使用參數的 Console.Clear() 方法。 由於這個方法可用來清除控制台中顯示的任何資訊,因此不需要參數來完成其工作。
多載方法
.NET Class Library 中有許多方法都具有「多載」方法簽章。 除此之外,這可讓您在呼叫陳述式中指定或不指定引數的情況下呼叫方法。
多載方法是以多個方法簽章定義。 多載方法能提供不同的方式來呼叫方法,或提供不同類型的資料。
在某些情況下,方法的多載版本會用於使用不同的資料類型來定義參數。 例如,Console.WriteLine() 方法具有 19 個不同的多載版本。 大部分多載都允許方法接受不同類型,然後將指定的資訊寫入主控台。 請考慮下列程式碼:
int number = 7;
string text = "seven";
Console.WriteLine(number);
Console.WriteLine();
Console.WriteLine(text);
在此範例中,您會叫用 WriteLine() 方法的三個不同多載版本。
- 第一個
WriteLine()方法會使用定義int參數的方法簽章。 - 第二個
WriteLine()方法會使用定義零個參數的方法簽章。 - 第三個
WriteLine()方法會使用定義string參數的方法簽章。
在其他情況下,方法的多載版本會定義不同的參數數目。 替代的輸入參數可用來提供對所需結果的更多控制。 例如,Random.Next() 方法具有多載版本,可讓您對隨機產生的數字設定各種層級的條件約束。
下列練習會呼叫 Random.Next() 方法來產生具有不同條件約束層級的隨機整數值:
請確定您已在 Visual Studio Code 中開啟空的 Program.cs 檔案。
如有必要,請開啟 Visual Studio Code,然後完成下列步驟,以在編輯器中備妥 Program.cs 檔案:
在 [檔案] 功能表上,選取 [開啟資料夾]。
使用 [開啟資料夾] 對話框瀏覽至 CsharpProjects 資料夾,然後開啟。
在 Visual Studio Code EXPLORER 檢視中,選取 [Program.cs]。
在 Visual Studio Code [選取項目] 功能表上,選取 [全部選取],然後按 [刪除] 鍵。
若要檢查
Random.Next()方法的多載版本,請輸入下列程式碼:Random dice = new Random(); int roll1 = dice.Next(); int roll2 = dice.Next(101); int roll3 = dice.Next(50, 101); Console.WriteLine($"First roll: {roll1}"); Console.WriteLine($"Second roll: {roll2}"); Console.WriteLine($"Third roll: {roll3}");在 [Visual Studio Code 檔案 ] 功能表上,單擊 [ 儲存]。
在 EXPLORER 檢視中,若要在 TestProject 資料夾位置開啟終端機,請以滑鼠右鍵按兩下 TestProject,然後選取 [ 在整合式終端機中開啟]。
請確定命令提示字元中顯示的資料夾路徑會指向包含 Program.cs 檔案的資料夾。
在終端命令提示字元中,若要執行程式碼,請輸入 dotnet run,然後按 Enter 鍵。
請注意,您的結果看起來會類似下列輸出:
First roll: 342585470 Second roll: 43 Third roll: 89請注意,由於數字是隨機產生的,因此您的結果會有所不同。 不過,此範例會示範您可能會看到的結果範圍。
請花幾分鐘檢查程式碼。
Next()方法的第一個版本不會設定上限與下限,因此該方法將會傳回介於0到2,147,483,647(int可以儲存的最大值) 之間的值。Next()方法的第二個版本將最大值指定為上限,因此在此狀況下,您可以預期介於0到100之間的隨機值。Next()方法的第三個版本指定了最小值與最大值,因此在此狀況下,您可以預期介於50到100之間的隨機值。關閉 [終端] 面板。
您已在此單元中檢查數個主題。 以下是您所涵蓋項目的快速清單:
- 您已檢查如何使用方法的傳回值 (當方法提供傳回值時)。
- 您已經檢視了方法如何使用定義為特定資料類型的參數。
- 您已經檢視了一些包含不同參數或參數類型的方法的多載版本。
使用 IntelliSense
Visual Studio Code 包含由語言服務支援的IntelliSense功能。 例如,C# 語言服務會根據語言語意和原始程式碼的分析,提供智慧型程式碼完成功能。 在本節中,您將使用 IntelliSense 來協助您實作 Random.Next() 方法。
由於 IntelliSense 會在程式碼編輯器中公開,因此您可以在不離開程式碼環境的情況下深入了解方法。 IntelliSense 能在您輸入程式碼時,於資料指標位置下方的快顯視窗中提供提示與參考資訊。 在您輸入程式碼時,IntelliSense 快顯視窗將會根據內容變更其內容。
例如,當您慢慢輸入 dice 這個單字時,IntelliSense 將會顯示 .NET Class Library 中符合輸入字母的所有 C# 關鍵字、識別碼 (或者程式碼中的變數名稱) 與類別。 您可以使用程式碼編輯器的自動完成功能,來完成輸入 IntelliSense 快顯視窗中最符合的單字。 請試試看。
請確定您已在 Visual Studio Code 中開啟您的 Program.cs 檔案。
您的應用程式應包含以下程式碼:
Random dice = new Random(); int roll1 = dice.Next(); int roll2 = dice.Next(101); int roll3 = dice.Next(50, 101); Console.WriteLine($"First roll: {roll1}"); Console.WriteLine($"Second roll: {roll2}"); Console.WriteLine($"Third roll: {roll3}");在程式碼檔案底部,若要試驗 IntelliSense,請緩慢輸入字母
d、i,然後輸入c。請注意當您開始輸入時出現的 IntelliSense 快顯視窗。
當 IntelliSense 彈出時,應該會出現建議的清單。 在您輸入
dic時,識別碼dice應該位於清單頂端。按下鍵盤上的 Tab 鍵。
請注意,整個字組
dice會在編輯器中完成。 您可以在按下 Tab 鍵之前,使用向上鍵和向下鍵來變更選取範圍。備註
如果 IntelliSense 視窗消失,您可以使用鍵盤上的
backspace按鍵加以選取,然後重新輸入最後一個符號以重新開啟 IntelliSense。若要指定成員存取運算子,請輸入
.字元。請注意,當您輸入
.並顯示所有可用方法 (和類別之其他成員) 的未篩選清單時,IntelliSense 快顯視窗會再次出現。輸入 N
系統將會篩選該清單,而
Next單字應該會成為最上方的選取項目。若要自動完成整個字組,請按 Tab 鍵。
若要指定方法叫用運算子,請輸入 (
請注意,系統會自動為您新增右括弧。
方法叫用運算子是位於方法名稱右邊的括弧集合。 呼叫陳述式的這個部分是您指定將傳遞給方法的引數的位置。 在呼叫方法時會需要方法叫用運算子。
請注意,IntelliSense 快顯視窗現在會顯示
Random.Next()方法的詳細資訊。請花一分鐘檢查
Random.Next()方法的 IntelliSense 快顯視窗。備註
如果在您有機會檢查 IntelliSense 之前關閉 IntelliSense 快顯視窗,請刪除叫用運算子
(),然後輸入 ( 以顯示 IntelliSense 快顯視窗。請注意,快顯視窗包含三個區段,一個位於左側,兩個位於右側。
在右側,您應該會看到頂端區段中的
int Random.Next(),以及底部區段中的Returns a non-negative random integer.。int會定義方法的傳回型別。 換句話說,執行此版本的方法時,會傳回int類型的值。在 IntelliSense 快顯視窗的左側,會顯示
1/3。1/3表示您正在查看Next()方法之三個方法簽章的第一個。 請注意,此版本的方法簽章可讓該方法在沒有參數的情況下運作 (在呼叫陳述式中沒有引數傳遞給該方法)。請注意,
1/3的上方與下方也各有一個小箭頭。若要檢查方法的第二個多載版本,請按鍵盤上的向下鍵。
請注意,您可以使用向上鍵和向下方向鍵,在各種多載版本之間巡覽。 當您這樣做時,您會看到
1/3、2/3和3/3出現在 IntelliSense 快顯視窗左側,以及右側的實用說明。請花一分鐘檢查
Random.Next()方法的每個多載版本。方法的第二個多載版本
2/3會告知您該Next()方法可以接受參數int maxValue。 描述會告訴您,maxValue是您想要Next()方法產生之數字的獨佔上限。 獨佔表示傳回號碼會小於 maxValue。 因此,當您指定dice.Next(1,7);,最大骰子投擲將會是 6。 請注意,區段底部的訊息已更新為:Returns a non-negative random integer that is less than the specified maximum.方法的第三個版本
3/3會告知您,Next()方法可以同時接受int minValue與int maxValue作為參數。 新參數minValue是您想要Next()方法產生之數字的下限。 由於內含下限而非獨佔,因此傳回值可以等於minValue。 底部的訊息現在會呈現:Returns a random integer that is within a specified range.在此情況下,IntelliSense 會提供您選取適當多載所需的所有資訊,包括
maxValue和minValue的詳細說明。 不過,您可能會遇到需要參閱方法文件的情況。
如需多載方法的相關資訊,請使用 learn.microsoft.com
了解方法多載版本的第二個方法,是參考該方法的文件。 文件也能協助您確切了解每個參數的用途。
若要開始,請開啟您慣用的網頁瀏覽器和搜尋引擎。
執行 C# Random.Next() 的搜尋
您的搜尋應該包含類別名稱和方法名稱。 您可能也會想要包含
C#字詞,以確保不會意外取得其他程式設計語言的結果。選取 URL 開頭為
https://learn.microsoft.com的頂端搜尋結果。最上方的其中一個搜尋結果應能引導您前往以
https://learn.microsoft.com為開頭的 URL。 在此情況下,連結的標題應該會顯示為Random.Next Method。以下是該連結,以防您無法使用搜尋引擎找到它:
開啟 C# Random.Next() 的連結。
快速掃描文件。
向下捲動頁面內容以查看各種程式碼範例。 請注意,您可以在瀏覽器視窗中執行範例。
learn.microsoft.com 文件針對 .NET Class Library 中每個類別與方法遵循標準格式。
在網頁頂端附近,找出標示為 [多載] 的區段。
請注意,列出方法的三個多載版本。 列出的每個多載版本都會包含頁面更下方位置的超連結。
若要瀏覽「頁面上」至第二個多載版本的描述,請選取 [下一步 (Int32)] 。
方法的各版本文件包括:
- 方法功能的簡短描述
- 方法的定義
- 方法可接受的參數
- 傳回值
- 可能會引發的例外狀況
- 使用方法的範例
- 方法的其他相關備註
請花一分鐘的時間檢閱 [參數] 區段。
在 [參數] 章節,您可以看到
maxValue參數是「要產生之隨機數字的獨佔上限」。「獨佔上限」的意思是如果您不想讓數字超過10,則您必須傳入值11。您也會在下一行讀到:「
maxValue必須大於或等於 0」。如果您忽略這句,會發生什麼事? 您可以在<例外狀況>章節中看到,該方法將會在ArgumentOutOfRangeException小於 0 時傳回maxValue。備註
learn.microsoft.com 的內容是 .NET 類別庫的「事實來源」。 請務必撥冗閱讀該文件,以了解特定方法的運作方式。
回顧
- 方法可能不接受任何參數或接受多個參數 (取決於其設計與實作的方式)。 在傳遞多個參數時,請以
,符號加以分隔。 - 方法可能會在完成其工作時傳回值,也可能不會傳回任何內容 (void)。
- 多載方法支援數個方法實作,每個實作都會有唯一的方法簽章 (參數的數目,以及每個參數的資料類型)。
- IntelliSense 可以協助您更迅速地撰寫程式碼。 此功能提供方法的快速參考、傳回值、多載版本及參數的類型。
- 想要了解 .NET Class Library 中方法的運作方式時,learn.microsoft.com 是「信任來源」。
檢定您的知識
意見反應
此頁面對您有幫助嗎?
No
需要本主題的協助嗎?
想要嘗試使用 Ask Learn 來釐清或引導您完成本主題嗎?