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();
类里面的函数叫做_方法_。每个方法可以有零个或多个形参。所有形参都必须显式声明类型,形参没有类型推断。同样,返回类型也必须显式声明。方法用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