C# 是靜態型別的語言,這表示所有東西在編譯時期都有型別。將值指定給一個名稱,就叫做定義變數。定義變數時,可以明確指定它的型別,也可以讓 C# 編譯器根據指定的值推斷它的型別(這叫做_型別推斷_)。因此,下面這兩種變數定義方式是等價的:
int explicitVar = 10; // Explicitly typed
var implicitVar = 10; // Implicitly typed
更新變數的值要透過=運算子。變數一旦定義之後,它的型別就永遠不會改變。
var count = 1; // Assign initial value
count = 2; // Update to new value
// Compiler error when assigning different type
// count = false;
C# 是物件導向語言,而且所有函式都必須定義在_類別_裡面。定義類別用的是class關鍵字。物件(或_實例_)則是使用new關鍵字建立的。
class Calculator
{
// ...
}
var calculator = new Calculator();
類別裡的函式就叫做_方法_。每個方法可以有 0 個或多個參數。所有參數都必須明確標註型別,參數沒有型別推斷。同樣地,回傳型別也必須明確寫出來。方法是使用return關鍵字來回傳值。如果要讓其他檔案的程式碼能呼叫某個方法,就必須加上public存取修飾詞。
class Calculator
{
public int Add(int x, int y)
{
return x + y;
}
}
方法是在實例上使用點(.)語法來呼叫的,要指定呼叫的方法名稱,並為方法的每個參數傳入引數。引數可以選擇性地指定對應的參數名稱。
var calculator = new Calculator();
var sum_v1 = calculator.Add(1, 2);
var sum_v2 = calculator.Add(x: 1, y: 2);
C# 的作用域定義在{和}字元之間。
C# 支援兩種註解。單行註解前面要加//,多行註解則放在/*和*/之間。
Lucian 的女朋友正在回家的路上,而他還沒煮好他們的週年紀念晚餐!
在這個練習中,你將寫一些程式碼,幫 Lucian 依照他最愛的食譜做出一道美味的千層麵。
你有四項任務,全都和烹調千層麵所花費的時間有關。
定義 Lasagna.ExpectedMinutesInOven() 方法,它不接受任何參數,並回傳千層麵應該在烤箱裡待幾分鐘。根據食譜,預期的烤箱時間是 40 分鐘:
var lasagna = new Lasagna();
lasagna.ExpectedMinutesInOven();
// => 40
定義 Lasagna.RemainingMinutesInOven() 方法,它接受千層麵實際待在烤箱裡的分鐘數作為參數,並根據上一項任務中預期的烤箱時間,回傳千層麵還需要在烤箱裡待幾分鐘。
var lasagna = new Lasagna();
lasagna.RemainingMinutesInOven(30);
// => 10
定義 Lasagna.PreparationTimeInMinutes() 方法,它接受你加進千層麵的層數作為參數,並回傳你花了幾分鐘準備千層麵,假設每一層要花你 2 分鐘準備。
var lasagna = new Lasagna();
lasagna.PreparationTimeInMinutes(2);
// => 4
定義 Lasagna.ElapsedTimeInMinutes() 方法,它接受兩個參數:第一個參數是你加進千層麵的層數,第二個參數是千層麵待在烤箱裡的分鐘數。這個函式應該回傳你花了幾分鐘烹調千層麵,也就是準備時間的分鐘數,加上千層麵當下已經待在烤箱裡的分鐘數。
var lasagna = new Lasagna();
lasagna.ElapsedTimeInMinutes(3, 20);
// => 26