switch 语句维基百科把 switch 语句描述为“一种选择控制机制,用来让变量或表达式的值改变程序的执行流程”。
这套机制涉及以下几个关键字:switch、case、break 和 default。
最简单的情况下,它们会对基元表达式或字符串表达式进行判断,并根据其值做出决定。例如:
string direction = GetDirection();
switch (direction)
{
case "left":
GoLeft();
break;
case "right":
GoRight();
break;
default:
MarkTime();
break;
}
最复杂的情况下,它们会引入向下转型 case <Type> <variable>: 和守卫(when)。
Animal animal = GetAnimal();
switch (animal)
{
case Dog canine:
case Coyote canine:
canine.Bark();
break;
case Cat cat when cat.HasOnly8Lives():
cat.IsCareful();
cat.Meow();
break;
case Cat cat:
cat.Meow();
break;
}
你正在开发一个系统,帮助一家足球俱乐部网站的工作人员报道比赛。 这个系统能够分析比赛的方方面面,无论场上还是场下,并把它们转换成事件流。
这支球队一直只踢 4-3-3 阵型,从来不认同 1965 年允许换人的规则修改,更别提扩大阵容了。
球员描述如下:
1 -> "goalie"
2 -> "left back"
3 & 4 -> "center back"
5 -> "right back"
6, 7 & 8 -> "midfielder"
9 -> "left wing"
10 -> "striker"
11 -> "right wing"
实现静态方法 PlayAnalyzer.AnalyzeOnField(),根据球员的球衣号码输出球员描述。
PlayAnalyzer.AnalyzeOnField(10);
// => "striker"
修改 PlayAnalyzer.AnalyzeOnField() 方法,当处理 1-11 范围之外的球衣号码时报告 UNKNOWN。
实现 PlayAnalyzer.AnalyzeOffField() 方法,输出球场周围的活动和人物的描述。
这个方法会接收不同类型的数据,你需要分析这些数据,并把它们转换成合适的文字,帮助记者们。
首先,我们会处理球场相关的数据:
int)string)未知类型的数据不应被处理,因此如果方法接收到其他类型的数据,应返回空字符串。
PlayAnalyzer.AnalyzeOffField(5000);
// => "There are 5000 supporters at the match."
PlayAnalyzer.AnalyzeOffField("5 minutes to go!");
// => "5 minutes to go!"
PlayAnalyzer.AnalyzeOffField(0.5);
// => ""
修改 PlayAnalyzer.AnalyzeOffField() 方法,输出比赛中发生的事件的描述。
事件可以是 Incident 类型的任意子类,其中会包含对该事件的描述。
受伤是一种特殊的事件,因为它会导致比赛暂停,所以要区别对待。
PlayAnalyzer.AnalyzeOffField(new Foul());
// => "The referee deemed a foul."
PlayAnalyzer.AnalyzeOffField(new Injury(8));
// => "Oh no! Player 8 is injured. Medics are on the field."
修改 PlayAnalyzer.AnalyzeOffField() 方法,提到比赛期间在场的俱乐部主教练。
主教练是 Manager 类型的实例,带有自己的名字以及所执教俱乐部的名称。
主教练的俱乐部可能是未知的,这种情况下它会被设为 null。
如果主教练的俱乐部未知,它就不应出现在描述中。
PlayAnalyzer.AnalyzeOffField(new Manager("José Mário dos Santos Mourinho Félix", null));
// => "José Mário dos Santos Mourinho Félix"
PlayAnalyzer.AnalyzeOffField(new Manager("Jürgen Klopp", "Liverpool"));
// => "Jürgen Klopp (Liverpool)"