流程控制-分支-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;
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();
        }
    }
}
posted @ 2009-03-12 16:02    阅读(442)  评论(0编辑  收藏  举报