流程控制-分支-switch语句
switch语句非常类似与if语句,因为它也是根据测试的值来有条件的执行代码。但是,switch语句可以一次将测试变量与多个值进行比较,而不是仅测试一个条件。这种测试仅限于离散的值,而不是像“大于X”这样的子句,所以它的用法有点不同,但它仍是一种强大的技术。
switch语句的基本结构如下:
switch(<testVar>)
{
case<comparisonVar1>:
<code to execute if <testVar> == <comparisonVal1>>
break;
case<comparisonVal2>:
<code to execute if <testVar> == <comparisonVal2>>
break;
...
case<comparisonValN>:
<code to execute if <testVar> == <comparisonValN>>
break;
default:
<code to execute if <testVar> != comparisonVals>
break;
}
<testVar>中的值与每个<comparisonValX>值(在case语句中指定)进行比较,如果有一个匹配,就执行为该匹配提供的语句。如果没有匹配,就执行default部分中的代码。
执行完每个部分中的代码后,还需要另一个语句break。在执行完一个case块后,再执行第二个case语句是非法的(与C++有所区别,C++中可以连续运行case语句)。
这里的break语句将终端switch语句的执行,而执行该结构后面的语句。
在C#代码中,还有另一种方法可以防止程序流程从一个case语句转到下一个case语句。可以使用return语句,中断当前函数的运行,这远胜于终端switch结构的执行。也可以使用goto语句,因为case语句就是在C#代码中定义标签。例如:
switch(<testVar>)
{
case<comparisonVar1>:
<code to execute if <testVar> == <comparisonVal1>>
goto case <comparisonVal2>;
case <comparisonVal2>:
<code to execute if <testVar> == <comparisonVal2>>
break;
...
}
一个case语句处理完后,不能自由进入下一个case语句,但这个规则有一个例外。如果把多个case语句放在一起(堆叠它们),其后加一行代码,实际上是一次检查多个条件。如果满足这些条件中的任何一个,就会执行代码,例如:
switch(<test>)
{
case<comparisonVal1>:
case<comparisonVal2>:
<code to execute if <testVar> == <comparisonVal1> or <testVar> == <comparisonVal2>>
break;
...
}
注意这些条件也应用到default语句。default语句不一定要放在比较操作列表的最后。还可以把它和case语句放在一起。用break、goto或return添加一个断点,可以确保在任何情况下,该结构都有一个有效的执行路径。
每个<comparisonValX>都必须是一个常量。一种方法是提供字面值,例如:
switch(myInteger)
{
case 1:
<code to execute if myInteger == 1>
break;
case -1:
<code to execute if myInteger == -1>
break;
default:
<code to execute if myInteger != comparisons>
break;
}
另一种方式是使用常量。常量与其他变量一样,但有一个重要的区别:它们包含的值是固定不变的。一旦给常量指定一个值后,该常量在代码执行过程中,其值一直不变。在这里使用常量是很方便的,因为它们通常容易阅读,在比较时看不到要比较的值。
除了变量类型外,还可以使用关键字const声明变量,同时必须给它们赋值,例如:
const int intTwo = 2;
这行代码是有效的,但如果编写如下代码:
const int intTwo;
intTwo = 2;
就会产生一个编译错误。在最初的赋值之后,用任何方式改变常量的值都是错误的!
在下面的例子中,将使用switch语句,根据用户为测试字符串输入的值,把不同的字符串写到控制台上:
using System.Collections.Generic;
using System.Text;
namespace ConsoleApplication6
{
class Program
{
static void Main(string[] args)
{
const string myName = "Karli";
const string sexyName = "angelina";
const string sillyName = "ploppy";
string name;
Console.WriteLine("你叫什么名字?");
name = Console.ReadLine();
switch (name.ToLower)
{
case myName:
Console.WriteLine("你有一个和我一样的名字!");
break;
case sexyName:
Console.WriteLine("你有一个性感的名字!");
break;
case sillyName:
Console.WriteLine("你有一个愚蠢的名字!");
break;
}
Console.WriteLine("Hello {0}!",name);
Console.ReadKey();
}
}
}