練習 - 呼叫 .NET 類別的方法

已完成

不論您是否發現這件事,但自您首次使用「Hello, World!」應用程式以來,您便已呼叫 C# 方法。 該應用程式使用 Console 類別的 WriteLine() 方法來顯示「Hello, World!」訊息。

然而,並非所有類別與方法都是以相同方式實作。 此單元會涵蓋一些常見的變體,這些變體是您在使用來自 .NET Class Library 的方法時所應該了解的。 更重要的是,您將會了解如何尋找並使用文件以進一步了解每個方法。

如何呼叫 .NET Class Library 中的方法

根據您先前使用 Console.WriteLine() 方法的經驗,您應該已經知道基本概念:

  • 一開始,請輸入類別名稱。 在此情況下,類別名稱為 Console
  • 新增成員存取運算子,也就是 . 符號。
  • 新增方法的名稱。 在此情況下,方法的名稱是 WriteLine
  • 新增方法叫用運算子,也就是一組括弧 ()
  • 最後,指定在方法調用運算子的括弧之間有任何傳遞至方法的引數。 在此情況下,您會指定您想要 Console.WriteLine() 方法寫入主控台的文字,(例如,"Hello World!")。

(選擇性) 根據開發人員設計及實作指定方法的方式,您可能也需要:

  • 將其他值傳遞為輸入參數。
  • 接受傳回值。

在下一個單元中,您將檢查如何將輸入值傳遞至方法,以及如何使用方法將值傳回呼叫常式。

雖然某些方法可以用與您呼叫 Console.WriteLine() 的相同方式呼叫,但 .NET Class Library 中有其他方法需要使用不同的方式。

準備您的撰寫程式碼環境

本課程模組包含程式碼撰寫活動,引導您完成建置和執行範例程式碼的程式。 建立您使用 Visual Studio Code 做為開發環境來完成這些活動。 針對這些活動使用 Visual Studio Code,可協助您更熟悉在全球專業人員使用的開發人員環境中撰寫及執行程式碼。

  1. 打開 Visual Studio Code。

    您可以使用 Windows [開始] 功能表 (或另一個作業系統的對等資源) 來開啟 Visual Studio Code。

  2. 在 Visual Studio Code 的 [檔案] 功能表上,選取 [開啟資料夾]。

  3. [開啟資料夾] 對話方塊中,瀏覽至 [Windows Desktop] 資料夾。

    如果您在不同的資料夾位置中保留程式碼專案,您可以改用該資料夾位置。 針對本訓練,請務必使用容易找到並記住的位置。

  4. 在 [開啟資料夾] 對話方塊中,選取 [選取資料夾]。

    如果您看到詢問您是否信任作者的安全性對話方塊,請選取 [是]。

  5. 在 Visual Studio Code 的 [終端] 功能表上,選取 [新增終端]。

    請注意,終端面板中的命令提示字元會顯示目前資料夾的資料夾路徑。 例如:

    C:\Users\someuser\Desktop>
    

    注意

    如果您是在自己的電腦上工作,而不是在沙箱或託管環境中工作,且您已完成此 C# 系列中的其他 Microsoft Learn 課程模組,您可能已針對程式碼範例建立專案資料夾。 如果是這種情況,您可以略過下一個步驟,這個步驟會用來在 TestProject 資料夾中建立主控台應用程式。

  6. 在終端命令提示字元中,若要在指定的資料夾中建立新的主控台應用程式,請輸入 dotnet new console -o ./CsharpProjects/TestProject,然後按 Enter 鍵。

    這個 .NET CLI 命令會使用 .NET 程式範本,在指定的資料夾位置中建立新的 C# 主控台應用程式專案。 這個命令會為您建立 CsharpProjects 和 TestProject 資料夾,並使用 TestProject 做為 .csproj 檔案的名稱。

  7. 在 [總管] 面板中,展開 CsharpProjects 資料夾。

    您應該會看到 TestProject 資料夾和兩個檔案:名為 Program.cs 的 C# 應用程式檔案,以及名為 TestProject.csproj 的 C# 專案檔。

  8. 在 [總管] 面板中,若要在 [編輯器] 面板中檢視程式碼檔案,請選取 [Program.cs]。

  9. 刪除現有的程式碼。

    您將使用此 C# 主控台專案,在本課程模組期間建立、建置及執行程式碼範例。

  10. 關閉 [終端] 面板。

呼叫 .NET Class Library 中不同類型的方法

  1. 在 [Visual Studio Code 編輯器] 中,若要建立實作 System.RandomSystem.Console 類別方法的程式碼範例,請輸入下列程式碼:

    Random dice = new Random();
    int roll = dice.Next(1, 7);
    Console.WriteLine(roll);
    
    

    此程式碼會使用 Random.Next() 方法來模擬擲骰子,以產生數位,並使用 Console.WriteLine() 方法來顯示值。

    注意

    您稍後會在此單元中詳細檢查程式碼。

  2. 在 Visual Studio Code 的 [檔案] 功能表上,按一下 [儲存]

  3. 在 [總管] 面板中,若要在 TestProject 資料夾位置開啟 [終端],請以滑鼠右鍵按一下 [TestProject],然後選取 [在整合式終端機中開啟]。

    請注意,[終端] 面板包含顯示資料夾路徑的命令提示字元。 例如:

    C:\Users\someuser\Desktop\CsharpProjects\TestProject>

    當您使用 [終端] 執行 .NET CLI 命令時,此資料夾位置是命令將執行的位置。 在建置或執行程式碼之前,請確定您的程式碼資料夾符合命令提示字元中顯示的資料夾路徑。

  4. 在終端命令提示字元中,若要執行程式碼,請輸入 dotnet run,然後按 Enter 鍵。

    請注意,一個介於 1 到 6 的數字會顯示在主控台輸出中 (骰子上的點數)。 如果您執行程式碼的時間夠長,您終會看到它顯示出每一個數字。

  5. 請花一分鐘時間檢查用來存取 Next()WriteLine() 方法的語法。

    請注意,您可以使用不同的技術來存取方法。

    Random dice = new Random();
    int roll = dice.Next(1, 7);
    Console.WriteLine(roll);
    
    

    在第三行程式碼中,您會將參考包含至 Console 類別,並直接呼叫 Console.WriteLine() 方法。 不過,您可以使用不同的技術來呼叫 Random.Next() 方法。 您之所以會使用兩個不同的方式來呼叫,是因為某些方法是具狀態,而其他方法則是無狀態的。 下一個步驟是檢查具狀態和無狀態方法之間的差異。

具狀態與無狀態方法

在軟體發展專案中,狀態 一詞是用來描述執行環境在特定時間點的條件。 隨著您的程式碼逐步執行各行,值會被儲存在變數中。 在執行期間的任何時間點,應用程式的目前狀態便是儲存在記憶體中之所有值的集合。

某些方法不需仰賴應用程式的目前狀態便能正常運作。 換句話說,無狀態方法的實作原因,便是因為其可以在無需參考或變更儲存在記憶體中任何值的情況下運作。 無狀態方法也稱為靜態方法

例如,Console.WriteLine() 方法不需要仰賴儲存在記憶體中的任何值。 能在不以任何方式影響到應用程式狀態的情況下執行其功能並結束。

不過,其他方法則必須存取應用程式的狀態才能正常運作。 換句話說,具狀態方法的建置方式,使其必須仰賴由已執行的前幾行程式碼儲存在記憶體中的值。 或者會透過更新記憶體中的值,或是將新值儲存在記憶體中來修改應用程式的狀態。 也稱為執行個體方法

具狀態 (執行個體) 方法會在欄位中追蹤其狀態,這些欄位是在類別上定義的變數。 類別的每個新執行個體都會自行擁有那些欄位的複本,以在其中儲存狀態。

單一類別可以同時支援具狀態與無狀態方法。 不過,當您需要呼叫具狀態方法時,您必須先建立類別的執行個體,來使該方法可以存取狀態。

建立類別的執行個體

類別的執行個體稱為物件。 若要建立類別的新執行個體,您會使用 new 運算子。 請考慮下列程式碼,這會建立 Random 類別的新執行個體,以建立稱為 dice 的新物件:

Random dice = new Random();

new 運算子會執行數個重要工作:

  • 會先要求電腦記憶體中的位址,該位址必須大到可以儲存以 Random 類別為基礎的新物件。
  • 會建立新物件,並將其儲存在該記憶體位址。
  • 會傳回記憶體位址,以將其儲存在 dice 變數中。

從那裡開始,在參考 dice 變數時,.NET 執行階段便會在幕後執行查詢,以營造出您是直接使用物件本身的假象。

最新版的 .NET Runtime 可讓您具現化物件,而不必重複類型名稱 (目標類型建構函式調用)。 例如,下列程式碼會建立 Random 類別的新執行個體:

Random dice = new();

其目的是要簡化程式碼可讀性。 撰寫目標類型 new 運算式時,一律使用括弧。

為什麼 Next() 方法是具狀態的?

您可能會想知道為什麼 Next() 方法是實作為具狀態方法? 難道 .NET Class Library 設計人員找不出辦法在不需要狀態的情況下產生亂數? 而 Next() 方法所儲存或參考的確切內容又是什麼?

這些都是很合理的問題。 概括而言,電腦很擅長遵循特定指示來建立可靠且可重複的結果。 為了建立隨機性的假象,Next() 方法的開發人員決定擷取細微至將毫秒再加以細分的日期和時間,並將其用來植入每次都能產生不同數字的演算法。 雖然並非完全隨機,但已足以供大部分的應用程式使用。 在 dice 物件存留期間擷取並維護的狀態,便是種子值。 針對 Next() 方法的每個後續呼叫都會重新執行該演算法,但會確保種子會變更,來使系統不 (一定) 會傳回相同的值。

不過,若要使用 Random.Next() 方法,您不需要了解其運作方式。 重要的是要知道某些方法需要您在呼叫之前先建立其類別的執行個體,而其他方法則不需要。

在呼叫某個類別的方法之前,要如何判斷是否需要先建立該類別的執行個體?

判斷一個方法為具狀態或無狀態的方法之一是參閱文件。 該文件包含說明該方法必須從物件執行個體呼叫,還是直接從類別呼叫的範例。

注意

您可能需要在文件頁面上向下捲動,以尋找程式碼範例。

除了搜尋產品文件,您也可以嘗試直接從類別本身存取方法。 如果可行,您就會知道它是無狀態方法。 就算不行,最糟糕的情況也只是收到編譯錯誤而已。

嘗試直接存取 Random.Next() 方法,並看看會發生什麼事。

  1. 在 [Visual Studio Code 編輯器] 中輸入下列程式碼行:

    int result = Random.Next();
    
    

    您已經知道 Next() 是具狀態的方法,不過此範例示範當您嘗試不正確存取方法時,Visual Studio Code 編輯器會如何回應。

  2. 請注意,紅色波浪線會出現在 Random.Next 底下,表示您有編譯錯誤。

    如果您想要使用的方法為無狀態,則不會出現紅色波浪線。

  3. 將滑鼠指標停留在紅色波浪線上方。

    快顯視窗應該會出現下列訊息:

    (1,14): error CS0120: An object reference is required for the non-static field, method, or property 'Random.Next()'
    
    

    如您在本單元開頭的程式碼中所見,您可以在存取 Next() 方法之前先建立 Random 類別的執行個體來修正此錯誤。 例如:

    Random dice = new Random();
    int roll = dice.Next();
    
    

    在此情況下,會呼叫 Next() 方法,而無需輸入參數。

概括回顧

  • 若要呼叫 .NET Class Library 中類別的方法,您會使用 ClassName.MethodName() 格式,其中 . 符號是用來存取定義於類別上之方法的成員存取運算子,而 () 符號則是方法叫用運算子。
  • 呼叫無狀態方法時,您不需要先建立其類別的新執行個體。
  • 呼叫具狀態方法時,您需要建立類別的執行個體,並存取物件上的方法。
  • 使用 new 運算子來建立類別的新執行個體。
  • 類別的執行個體稱為物件

檢定您的知識

1.

下列哪一項代表建立類別執行個體的正確方式?

2.

開發人員會建立名為 coinsRandom 類別的執行個體。 下列哪一行程式碼可用來呼叫 Next() 方法?