
C# 入門指南
單元 25 - 整合 Encrypt 類別

要整合 Encrypt 類別 (class) ,就要加入定義 Encrypt 類別的 Program.cs ,這時候在右側「方案總管」的 WpfAppDemo 上點擊滑鼠右鍵,就會出現快顯功能表,這時候找到「加入」,點擊「現有項目」

下面出現檔案選擇視窗,這時候找到 EncryptName 專案中的 Program.cs ,然後點擊加入按鈕

加入 Program.cs 後, Program.cs 就會顯示在「方案總管」中,此時注意到底下「輸出」的地方有兩則訊息,指的是 Program.cs 中 Program 類別的 Main() 方法 (method)

這時刪除掉整個 Program 類別,兩則訊息就會消失,如下

刪除 Program 類別是有必要的,因為 Program 類別的 Main() 方法是專案程式的執行入口之一,而 WPF App 專案的入口已經移到 MainWindow.xaml.cs ,因此如果不刪除 Program 類別會造成兩個執行入口,這樣無法執行。
接下來回到 MainWindow.xaml.cs ,首先加入以下紅色框框中的 using 程式碼

完整程式請參考「範例程式篇」的「 MainWindow.xaml.cs 」。
接下來設定私有欄位 (private field) Encrypt 型態的 encryptObject ,這時候程式碼行號的右側出現燈號,點擊燈號如下圖,這時候點擊封裝欄位 'encryptObject' (並使用屬性)

Visual Studio Community 2019 就會自動建立 encryptObject 的屬性 (property) ,如下

下面繼續在 NewButton_Click() 放入新的程式碼,如下

以下為 NewButton_Click() 的完整程式碼
private void NewButton_Click(object sender, RoutedEventArgs e)
{
EncryptObject = new Encrypt();
DisplayBlock.Text = "密碼表:" + EncryptObject.Code;
}
NewButton_Click() 先替 EncryptObject 屬性建立新的 Encrypt 物件,然後在 DisplayBlock 顯示密碼表。
接下來繼續建立新的私有欄位 result ,並且設定對應的屬性 Result ,如下

下面是 EncodeButton_Click() 的實作

以下為 EncodeButton_Click() 的完整程式碼
private void Encodebutton_Click(object sender, RoutedEventArgs e)
{
if (InputText.Text == "")
{
DisplayBlock.Text = "沒有輸入英文句子!";
}
else
{
if (EncryptObject == null)
{
DisplayBlock.Text = "沒有密碼物件!";
}
else
{
Result = EncryptObject.ToEncode(InputText.Text);
OutputText.Text = Result;
DisplayBlock.Text = "編碼成功!";
}
}
}
EncodeButton_Click() 做兩次條件判斷,第一次檢查使用者是否有輸入,因為使用者如果沒有輸入, InputText 的內容會是空字串 (empty string) ,做編碼也沒有意義,然後第二次檢查是否有建立 encryptObject ,這是因為如果沒有先建立 encryptObject ,也就是使用者沒有按過新建按鈕, encryptObject 就會是 null ,這樣無法編碼。
以上是用兩次的條件檢查進行錯誤控制,如果發生可能錯誤就在底下顯示相對應的提示訊息,雖然也可以用例外處理 (exception handling) 的方式進行錯誤控制,但是例外處理相對於條件檢查,例外處理需要比較多的資源。
兩次檢查完,巢狀 if-else 最後的 else 部分
Result = EncryptObject.ToEncode(InputText.Text);
OutputText.Text = Result;
DisplayBlock.Text = "編碼成功!";
這是呼叫 Encrypt 的 ToEncode() 方法進行編碼,然後把編碼結果儲存到 Result 屬性,並且把 Result 結果指派給 OutputText ,底下的提示訊息顯示「編碼成功」。
下面 DecodeButton_Click() 跟 EncodeButton_Click() 的實作很類似,先做兩次同樣的條件檢查,然後把呼叫 ToEncode() 換成 ToDecode()

接下來測試看看囉!先輸入英文句子,然後按新建按鈕

按下編碼按鈕

將編碼後的英文句子輸入到輸入方塊,然後按下解碼按鈕

三個按鈕的功能實作完成,下面繼續實作存檔與載入兩個按鈕。
相關教學影片

中英文術語對照 | |
---|---|
類別 | class |
空字串 | empty string |
例外處理 | exception handling |
方法 | method |
私有欄位 | private field |
屬性 | property |
參考資料 | |
---|---|
1. Visual Studio | Microsoft Docs - 使用 Visual Studio 進行 C# 開發 | |
2. Visual Studio | Microsoft Docs - 教學課程:使用 C# 建立一個簡單的應用程式 |
重點整理 |
---|
1. 從「方案總管」的快顯功能表可以加入「現有項目」,例如 EncryptName 專案中的 Program.cs 。 |
2. 專案只能有單一的執行入口,因此要刪去 Program.cs 中的 Main() 方法。 |
3. 新建按鈕建立新的 Encrypt 物件,並在視窗中顯示密碼表。 |
4. 編碼及解碼按鈕都是用兩層的 if-else 檢查無法編碼或解碼的情況,如果無法編碼或解碼就顯示相對應的提示訊息,反之利用 Encrypt 物件的編碼或解碼方法進行編碼或解碼。 |
問題與討論 |
---|
1. 為什麼在 WPF 專案中加入 Program.cs 要刪去 Main() ? |
2. 例外處理跟用 if-else 檢查有何不同? |
練習 |
---|
1. 承接上一個單元的 HelloDemo 專案,把設定 Display 的 Text 屬性改成設定為「你好」。 |
2. 承接上一個單元的 GuessGameDemo 專案,在 GameWindow 類別建立 Number 屬性,然後在 MainWindow.xaml 快速點擊 B3 按鈕兩次,在 MainWindow 類別建立 B3_Click() 方法,接著在 B3_Click() 輸入以下程式碼
|
3. 承上題,繼續替 B4 、 B4 及 B6 按鈕建立類似的方法。 |
4. 承上題,在方案總管利用滑鼠右鍵,選擇加入「新增項目」,加入 GuessGame 專案的 Program.cs 到 GuessGameDemo 專案中,然後把 Program 類別刪去。 |