在下面的練習(xí)中,將創(chuàng)建一個(gè)應(yīng)用程序,它包含的一個(gè)方法能夠計(jì)算一名顧問的收費(fèi)金額——假定該顧問每天收取固定的費(fèi)用,將根據(jù)工作了多少天來收費(fèi)。首先要開發(fā)應(yīng)用程序的邏輯,然后利用“生成方法存根向?qū)А眮韺懗鲞@個(gè)邏輯使用的方法。接著,我們將在一個(gè)控
開發(fā)應(yīng)用程序邏輯
1. 在Visual Studio 2005中打開My Documents文件夾下的Microsoft PressVisual CSharp Step by StepChapter 3DailyRate子文件夾中的DailyRate項(xiàng)目。
2. 在“解決方案資源管理器”中,雙擊Program.cs文件,以便在“代碼和文本編輯器”窗口中顯示程序。
3. 在run方法主體中添加以下語(yǔ)句:
double dailyRate = readDouble(“Enter your daily rate: “);
int noOfDays = readInt(“Enter the number of days: “);
writeFee(calculateFee(dailyRate, noOfDays));
應(yīng)用程序啟動(dòng)時(shí),run方法將由Main方法調(diào)用。
剛才在run方法中添加的代碼塊會(huì)調(diào)用readDouble方法(馬上就要開始寫這個(gè)方法),以便讓用戶輸入顧問的日費(fèi)率。下一個(gè)語(yǔ)句調(diào)用readInt方法(也馬上由我們來寫)來獲取天數(shù)。最后將調(diào)用writeFee方法(等待編寫),以便在屏幕上顯示結(jié)果。注意,傳給writeFee的值是calculateFee方法(最后一個(gè)要寫的方法)返回的值,該方法獲取日費(fèi)率和天數(shù),并計(jì)算出要支付的總金額。
注意 由于尚未寫好readDouble,readInt,writeFee或者calculateFee方法,所以“智能感知”無法在輸入上述代碼的時(shí)候自動(dòng)列出它們。另外,先不要試圖生成程序,因?yàn)榭隙〞?huì)失敗。
使用“生成方法存根向?qū)А眮砭帉懛椒?
1. 在“代碼和文本編輯器”窗口中,單擊run方法中的readDouble方法調(diào)用。
隨后會(huì)在readDouble的第一個(gè)字母(“r”)下方顯示一個(gè)小的下劃線圖標(biāo)。將鼠標(biāo)指針移至字母”r”,會(huì)自動(dòng)出現(xiàn)一個(gè)圖標(biāo)。將鼠標(biāo)指針懸停在這個(gè)圖標(biāo)上方,會(huì)顯示一條工具提示:“用于生成方法存根的選項(xiàng)(Shift + Alt + F10)”,并提供了一個(gè)下拉菜單。單擊下拉菜單,就會(huì)看到一個(gè)選項(xiàng):生成”DailyRate.Program”中的”ReadDouble”的方法存根。
2. 單擊“生成”DailyRate.Program”中的”ReadDouble”的方法存根”選項(xiàng)。
隨后,“生成方法存根向?qū)А睍?huì)檢查對(duì)readDouble方法的調(diào)用,判斷參數(shù)類型和返回值,并生成一個(gè)具有默認(rèn)實(shí)現(xiàn)的方法,如下所示:
private double readDouble(string p)
{
throw new Exception(“The method or operation is not implemented.”);
}
新方法是使用一個(gè)private限定符來創(chuàng)建的。方法主體目前只是擲出一個(gè)異常。我們將在下一步將主體替換成自己的語(yǔ)句。
3. 從readDouble方法中刪除throw new Exception(…);語(yǔ)句,將它替換成以下代碼行:
Console.Write(p);
string line = Console.ReadLine();
return double.Parse(line);
上述代碼塊會(huì)將變量p中的字符串輸出到屏幕。該變量是調(diào)用方法是傳遞的字符串參數(shù),其中包含提示用戶輸入日費(fèi)率的一條消息。用戶輸入一個(gè)值,該值將通過ReadLine方法讀入一個(gè)字符串中,并通過double.Parse方法轉(zhuǎn)換成一個(gè)double值。結(jié)果將作為方法調(diào)用的返回值傳回。
注意 ReadLine方法是與WriteLine配套的一個(gè)方法,它從鍵盤讀取用戶直到按回車鍵之前的輸入。用戶輸入的文本將作為返回值傳回。
4. 在run方法中,單擊readInt方法調(diào)用,按照和前面一樣的過程,為readInt方法生成一個(gè)方法存根。
readInt方法將使用一個(gè)默認(rèn)的實(shí)現(xiàn)來生成。
提示 為了生成一個(gè)方法存根,還可以右擊一個(gè)方法調(diào)用,并從彈出菜單中選擇“生成方法存根”。
5. 將readInt方法的主體替換成以下語(yǔ)句:
Console.Write(p);
string line = Console.ReadLine();
return int.Parse(line);
這個(gè)代碼塊和readDouble方法的非常相似。惟一的區(qū)別是方法返回一個(gè)int值,所以要使用int.Parse方法將字符串轉(zhuǎn)換成整數(shù)。
6. 右擊run方法中的calculateFee方法調(diào)用,選擇“生成方法存根”。
隨后會(huì)生成calculateFee方法:
private object calculateFee(double dailyRate, int noOfDays)
{
throw new Exception(“The method or operation is not implemented”);
}
注意,“生成方法存根向?qū)А笔褂脗魅氲膶?shí)參名稱來生成形參名稱(當(dāng)然,假如覺得不合適,完全可以更改形參名稱)。更讓人感興趣的是方法的返回類型,目前是object。這表明“生成方法存根向?qū)А睙o法根據(jù)當(dāng)前的上下文來確定方法應(yīng)該返回什么類型的值。object類型只是意味著一樣“東西”,在方法中添加具體的代碼時(shí),應(yīng)該把它修改成自己需要的類型。
7. 修改calculateFee方法的定義,使它返回一個(gè)double值:
private double calculateFee (double dailyRate, int noOfDays)
{
throw new Exception(“The method or operation is not implemented”);
}
8. 將calculateFee方法的主體替換成以下語(yǔ)句,它計(jì)算兩個(gè)參數(shù)值的乘積來獲得需要支付的金額,并返回結(jié)果。
return dailyRate * noOfDays;
9. 右擊run方法中的writeFee方法調(diào)用,選擇“生成方法存根”。
隨后會(huì)生成writeFee方法。注意,“生成方法存根向?qū)А备鶕?jù)calculateFee方法的定義判斷出writeFee方法的參數(shù)應(yīng)該是一個(gè)double參數(shù)。另外,方法調(diào)用沒有使用一個(gè)返回值,所以方法的類型為void:
private void writeFee(double p)
{
…
}
10. 在writeFee方法內(nèi)部輸入以下語(yǔ)句:
Console.WriteLine(“The consultant’s fee is: {0}”, p * 1.1);
注意 這個(gè)版本的WriteLine方法演示了如何利用一個(gè)簡(jiǎn)單的格式字符串。{0}是一個(gè)占位符;在求值的時(shí)候,它會(huì)被字符串之后的表達(dá)式(p * 1.1)的值替換掉。
11. 選擇“生成”|“生成解決方案”。
重構(gòu)代碼
Visual Studio 2005非常有用的一項(xiàng)特性就是對(duì)代碼進(jìn)行重構(gòu)。某些時(shí)候,我們需要在應(yīng)用程序的多個(gè)位置寫相同的(或者非常相似的)代碼。在這種情況下,可以選定剛剛輸入的代碼塊,然后從菜單欄中選擇“重構(gòu)”|“提取方法”。隨后會(huì)出現(xiàn)“提取方法”對(duì)話框,提示你輸入一個(gè)新方法的名稱,該方法將用于包含你剛才輸入的代碼。請(qǐng)輸入方法名,并單擊“確定”。隨后,系統(tǒng)將創(chuàng)建這個(gè)方法,并將你剛才輸入的代碼轉(zhuǎn)移到其中,剛才輸入的代碼則被替換成對(duì)該方法的一個(gè)調(diào)用。“提取方法”還具有一定的智能,可以判斷方法是否應(yīng)該獲取任何參數(shù)和返回值。
測(cè)試程序
1. 選擇“調(diào)試”|“開始執(zhí)行(不調(diào)試)”,Visual Studio 2005將生成程序,并運(yùn)行它。運(yùn)行時(shí)會(huì)顯示一個(gè)控制臺(tái)窗口。
2. 在Enter Your Daily Rate(輸入日費(fèi)率)提示之后,請(qǐng)輸入525,然后按回車鍵。
3. 在Enter The Number Of Days(輸入天數(shù))提示之后,請(qǐng)輸入17,然后按回車鍵。
程序會(huì)在控制臺(tái)上顯示以下消息:
The consultant’s fee is: 9817.5
按回車鍵返回Visual Studio 2005編程環(huán)境。
在最后一個(gè)練習(xí)中,將使用Visual Studio 2005調(diào)試器,以比較慢的步調(diào)來運(yùn)行程序。你將看到每個(gè)方法被調(diào)用的時(shí)刻(這個(gè)行動(dòng)稱為跳入),并看到每個(gè)return語(yǔ)句如何將控制返還給調(diào)用者(這個(gè)行動(dòng)稱為跳出)。進(jìn)入和離開方法時(shí),都需要使用“調(diào)試”工具欄上的工具。然而,在調(diào)試模式中運(yùn)行應(yīng)用程序時(shí),相同的命令也可從“調(diào)試”菜單中選擇。
使用Visual Studio 2005調(diào)試器依次執(zhí)行每個(gè)方法
1. 在“代碼和文本編輯器”窗口中,找到run方法。
2. 使鼠標(biāo)指針對(duì)準(zhǔn)run方法中的第一個(gè)語(yǔ)句。
run方法的第一個(gè)語(yǔ)句是:
double dailyRate = readDouble(“Enter your daily rate: “);
3. 右擊該行的任何地方,從彈出菜單中選擇“運(yùn)行到光標(biāo)處”。
程序?qū)㈤_始運(yùn)行,并在抵達(dá)run方法的第一個(gè)語(yǔ)句之后暫停。“代碼和文本編輯器”窗口左側(cè)的一個(gè)黃色箭頭指明了當(dāng)前語(yǔ)句,該語(yǔ)句還會(huì)用一個(gè)黃色背景來突出顯示。
4. 選擇“視圖”|“工具欄”,確定已經(jīng)勾選了“調(diào)試”工具欄。“調(diào)試”工具欄也許會(huì)停靠在其他工具欄旁邊。如果找不到這個(gè)工具欄,可以試著使用“視圖”菜單中的“工具欄”命令暫時(shí)隱藏它,并留意哪些按鈕從界面上消失了。重新顯示這個(gè)工具欄,就可以知道它應(yīng)該在什么位置出現(xiàn)。
提示 要想將“調(diào)試”工具欄獨(dú)立出來,請(qǐng)使用工具欄左側(cè)的控點(diǎn),把它拖放以“代碼和文本編輯器”窗口上方。
5. 單擊“調(diào)試”工具欄上的“逐語(yǔ)句”按鈕。這個(gè)行動(dòng)會(huì)使調(diào)試器跳入正在調(diào)用的方法。左側(cè)的黃色箭頭會(huì)指向readDouble方法的起始大括號(hào)。再次單擊“逐語(yǔ)句”按鈕,指針會(huì)轉(zhuǎn)向第一個(gè)語(yǔ)句:Console.Write(p);
提示 按F11鍵的作用等同于單擊“調(diào)試”工具欄上的“逐語(yǔ)句”按鈕。
6. 單擊“調(diào)試”工具欄上的“逐過程”按鈕。這會(huì)導(dǎo)致方法執(zhí)行下一個(gè)語(yǔ)句而不調(diào)試它。黃色箭頭將指向方法的第二個(gè)語(yǔ)句,程序會(huì)在一個(gè)控制臺(tái)窗口中顯示“Enter Your Daily Rate”提示(控制臺(tái)窗口可能隱藏在Visual Studio 2005后面)。
提示 按F10鍵的作用等同于單擊“調(diào)試”工具欄上的“逐過程”按鈕。
7. 單擊“調(diào)試”工具欄上的“逐過程”按鈕。這一次,黃色箭頭會(huì)消失,控制臺(tái)窗口將獲得焦點(diǎn),因?yàn)槌绦蛘趫?zhí)行Console.ReadLine方法,要求用戶輸入一些內(nèi)容。
8. 在控制臺(tái)窗口中輸入525,按回車鍵繼續(xù)。
隨后,控制將返回Visual Studio 2005。黃色箭頭將在方法的第三行出現(xiàn)。
9. 不要做出任何單擊行動(dòng),請(qǐng)將鼠標(biāo)指針移至方法第二行或第三行對(duì)line變量的引用上(具體對(duì)準(zhǔn)哪一行無關(guān)緊要)。
隨后會(huì)出現(xiàn)一條屏幕提示,它顯示了line變量的當(dāng)前值(525)。利用這個(gè)特性,可以確定在逐方法執(zhí)行的時(shí)候,變量已經(jīng)設(shè)置成自己期望的一個(gè)值。
10. 單擊“調(diào)試”工具欄上的“跳出”按鈕。
這會(huì)導(dǎo)致當(dāng)前方法繼續(xù)無中斷地運(yùn)行,直到結(jié)束。當(dāng)readDouble方法執(zhí)行完畢之后,黃色箭頭會(huì)指回run方法的第一個(gè)語(yǔ)句。
提示 按Shift + F11鍵的作用等同于單擊“調(diào)試”工具欄上的“跳出”按鈕。
11. 單擊“調(diào)試”工具欄上的“逐語(yǔ)句”按鈕。
黃色箭頭會(huì)移至run方法的第二個(gè)語(yǔ)句:
int noOfDays = readInt(“Enter the number of days: “);
12. 單擊“調(diào)試”工具欄上的“逐過程”按鈕。
這一次,選擇了直接運(yùn)行方法,而不逐語(yǔ)句地調(diào)試該方法。控制臺(tái)窗口將再次出現(xiàn),提示輸入一個(gè)天數(shù)。
13. 在控制臺(tái)窗口中輸入17,按回車鍵繼續(xù)。
控制將返回至Visual Studio 2005。黃色箭頭將移至run方法的第三個(gè)語(yǔ)句:
writeFee(calculateFee(dailyRate, noOfDays));
14. 單擊“調(diào)試”工具欄上的“逐語(yǔ)句”按鈕。
黃色箭頭將跳至calculateFee方法的起始大括號(hào)處。該方法將先于writeFee方法被調(diào)用。
15. 單擊“調(diào)試”工具欄上的“跳出”按鈕。
黃色箭頭將跳回run方法的第三個(gè)語(yǔ)句。
16. 單擊“調(diào)試”工具欄上的“逐語(yǔ)句”按鈕。
這一次,黃色箭頭將跳至writeFee方法的起始大括號(hào)處。
17. 讓鼠標(biāo)指針對(duì)準(zhǔn)方法定義中的p變量。
隨后將顯示p的值(8925.0)。
18. 單擊“調(diào)試”工具欄上的“跳出”按鈕。
隨后會(huì)在控制臺(tái)窗口中顯示消息“The consultant’s fee is: 9817.5”(如果控制臺(tái)窗口隱藏在Visual Studio 2005之后,請(qǐng)把它帶到前臺(tái)來顯示)。黃色箭頭將返回run方法的第三個(gè)語(yǔ)句。
19. 單擊“調(diào)試”工具欄上的“繼續(xù)”按鈕,使程序連續(xù)運(yùn)行,而不在每個(gè)語(yǔ)句處暫停。
應(yīng)用程序?qū)⒁恢边\(yùn)行至結(jié)束。
提示 還可以按F5鍵在調(diào)試器中繼續(xù)執(zhí)行。
恭喜!你已經(jīng)成功編寫并調(diào)用了方法,并利用Visual Studio 2005調(diào)試器對(duì)它們進(jìn)行了調(diào)試。