Chap 6 Notes
---------------------------
控制结构名称 |
说 明 |
详细内容 | ||||
分支结构 (条件语句) |
分支结构首先执行某种类型的测试(判断),根据测试(判断)的结果,执行一段代码,同时跳过其他代码集。 |
比较运算符 |
等于 == (双等号!); 不等于 != ;小于 < ; 大于 > ; 小于等于 <= ; 大于等于 >= | |||
If条件语句 |
If(intAge>=18) { Response.Write(“You are allowed in the club”); } -------------------------------------------------------------------- If(strAuto==”Porsche”) { Response.write(“U R driving a Porsche”); } else if(strAuto==”Lotus”) { Response.write(“U R driving a Lotus”); } else if(strAuto==”Lamborghini”) { Response.write(“U R driving a Lamborghini”); } else { Response.write(“Please enter which car U R driving”); } | |||||
逻辑运算符(使用括号可改变逻辑运算符的执行顺序) |
逻辑AND(与) && (中等优先级) |
用于连接两个布尔条件,如果这两个条件都等于true,则该条件就等于true |
If(intAge>=18 && intAge<=30) { Response.write(“U R allowed”); } | |||
逻辑OR(或) || (最低优先级) |
只要两个条件中有一个为true,该条件就为true |
If(intAge>=18 || name==”liudong”) { Response.write(“U R allowed”); } | ||||
逻辑NOT(非) ! (最高优先级) |
使true条件变为false,使false条件变为true |
If(!(intAge<18)) { Response.write(“U R allowed”); } | ||||
条件或三元运算符 |
If(条件语句) { //执行1 } else { //执行2 } 等价于 (条件语句 ? “执行1” : ”执行2”) 例如 Response.write(“U ordered”+intBooks+”book”+(intBooks!=1?“s”:“”)+”from web”); | |||||
比较字符串 |
可以使用与比较数值相同的方法比较字符串,但只能进行“等于==”和“不等于!=”的比较 | |||||
switch…case条件语句 |
1、switch语句用一个变量作为其参数; 2、必须显式地退出case或default代码块,break关键字一般用于标记case或default块的结尾,这样就把控制权传送给switch语句后面的一行; 3、case和default标签是不缩进的 4、switch语句在为一个组值确定执行什么操作时,不能使用比较运算符(如<、>等) switch(Confirmation) { case “fax”: Message.Text=”Fax”; break; case “Telephone”: Message.Text=”Telephone”; break; case “email”: Message.Text=”email”; break; default: Message.Text=”No Confirmation”; break; } --------------------------------------------------------------- 为多个值执行相同的代码: switch(Confirmation) { case “yes”: case “Yes”: case “YES”: case “Y”: case “y”: Message.Text=”Details will be sent”; break; } 等价于:使用.NET Framework的ToLower()方法把所有变量值改为小写 switch(Confirmation.ToLower()) { case “yes”: case “y”: Message.Text=”Details will be sent”; break; } --------------------------------------------------------------- 从一个case块显式地跳转到另一个case块: switch(statement) { case option1: //Do Sth If (Sth condition is met) { goto case option2; } break; case option2: //Do Sth else break; default: //Do Sth break; } | |||||
循环结构 |
1、循环结构可以让同一个代码块运行多次 2、循环语句可用break和continue来中断,对于非嵌套的循环,break语句退出循环,执行循环体下面的语句;对于嵌套循环,break语句只退出内层循环,而外层循环则继续进行。Continue语句可中断本次循环,但不退出循环体,而是继续执行下一次循环 |
for循环 |
1、 在知道循环次数的情况下使用for循环 2、 计数器、布尔条件、步长之间必须用分号隔开 3、 整个语句放在括号中 4、 循环体放在花括号中 |
for(int intCounter=0;intCounter<5;intCounter++) { Response.Write(“GOOD LUCK!!!”); } | ||
while循环 |
1、 在不知道迭代次数的情况下,用while循环 2、 在每个循环开始时进行判断,若条件为true,则继续循环 |
while(a != 100) { a=a+1; } | ||||
do…while循环 |
这个语法要注意的是while后面的分号和书写格式! |
do { a=a+1; }while(a!=100); | ||||
foreach…in循环 |
1、 该循环用于迭代集合中的项,依次对每个项执行一些操作 2、 循环执行的次数由集合本身的大小决定 |
foreach(object obj in collection) { //Operate on each obj object } | ||||
函数 |
函数允许暂缓当前代码的执行,而去运行另一个指定代码块(函数体)中的指令集,再返回到原来的代码 |
函数概述 |
1、 当应用程序庞大的时候,在多个地方用到相同程序的机会就很多。ASP.NET允许编写一次(一段)代码,再运行需要的次数,以支持代码主题。这些小段代码称为函数。 2、 函数的执行方式:从ASP.NET代码主题中跳出,运行函数中的命令,再返回来(有或无返回值)执行代码主体 3、 在C#中,“函数”又称为“方法”! | |||
定义函数 |
函数的简单语法 Page_Load() ToString() Convert.ToInt32() 等都是函数 |
返回值类型 函数名(参数类型1 参数名1,参数类型2,参数名2) { //函数代码; } | ||||
返回类型和参数 |
1、函数在内部执行完计算后,就要把结果(返回值)报告给调用代码(代码的主体)。 2、函数主体部分还包括return关键字,后面跟对应返回类型(返回类型在函数定义过程中进行定义!)的值或者变量 string MyFunc(string name,int age) { return “GOOD LUCK!!!”; } 3、有一种特殊的返回类型,即void,在没有(不需要)返回值的时候使用,若把函数指定为返回void,则不需要return关键字! void Page_Load() | |||||
调用函数 |
1、调用返回void的函数时: MyVoidFunction(“Hello”); 2、调用有返回值的函数时,可以(但不必须)提供一个变量来包含(接收)这个值: string ReturnValue; ReturnValue=MyFunction(); 还可以按如下方式使用(调用)函数: double payment=15*GetInterestRate()/100;或 decimal payment=15*(decimal)GetInterestRate()/100; 3、按值传送参数 (1)数值型按值传送参数时,在函数内部处理的是原数据的一个拷贝,并没有对调用代码中原变量的值进行改变 (2)在函数开始执行的时候就有了该拷贝,当函数执行结束的时候,该拷贝就消失了 (3)相当于有两个变量(函数中和主体调用程序中),每个变量有一个值,并没有在这两个变量间建立联系 void Increment(int Num) { Num=Num+1; } void Page_Load() { int A=1; Increment(A); Message.Text=A.ToString(); } 4、按引用传递参数 (1)如果要使函数中进行的计算影响到调用代码中变量的内容,应该按引用传送参数 (2)按引用定义函数的时候需要修改函数定义的开头,默认的行为是按引用传送参数,而不是按值传送 void Increment(ref int Num) { Num++; } void Page_Load() { int A=1; Increment(ref A); Message.Text=A.ToString(); } (3)使用上面的方法,等于在函数Increment的变量Num中创建了变量A的引用,所以在函数Increment中对Num变量做的任何改变,都会改变变量A的数据 (4)按引用传送参数的行为是对象类型(数据)的默认行为(如Label),也称为引用类型。即只要是对象类型,就默认是按照引用传送参数,而按引用传送参数的实质就是主体代码在调用函数时传递的(包含的)参数的值会随函数的计算结果发生变化 void AddLineToLabel(Label Target,string Line) { Target.Text=Line+”<br>”; } void Page_Load() { AddLineToLabel(Message,”Hello World”); } 在HTML中: <body> <asp:label id=Message runat=server /> </body> 5、输出参数 (1)输出参数的初始化工作是由被调用的函数来完成的,而一般情况下,参数的初始化是由调用函数的代码主体来完成的(参考(3)的书面解释) (2)在C#中一个函数可以给调用代码(代码主体)返回多个值,每个函数调用只能返回一个返回值,函数提供的其他值必须赋予特定的函数参数。 (3)参数的第三种类型(除按值传送和按引用传送以外)是其值在函数调用之前并没有设置,而是在函数代码运行时设置,并可以使用。对被调用的函数来说,在函数接收到该参数时,该参数就是只写的。也可以在代码主体中初始化参数的值,但函数会改写这个值 (4)学习本节的重点就是注意区分开调用参数(代码主体的参数)的值和函数经过内部处理返回的值(函数的返回值)! string SetNum(out int Num) { Num=10; Return “OK”; } void Page_Load() { int A; //在主体部分并没有对变量A进行赋值(初始化) string ReturnValue=SetNum(out A); //注意,上边的行定义了一个字符串变量来接收函数的返回值 Message1.Text=A.ToString(); Message2.Text=”<br>”+ReturnValue; } (5)使用.NET框架基类函数TimeSpan.FromDays()执行日期算法 DateTime FindDueDate(DateTime CheckOutDate) { return CheckOutDate+TimeSpan.FromDays(16); } (6)允许把TimeSpan类型的数据加到DateTime类型的数据上,以计算天数 (7)使用DateTime DT=DateTime.Now;语句可以得到系统目前的时间 | |||||
变量的作用域 |
概述 |
1、变量可以在函数内有一个值,在函数外有另一个值。即如果第一个(代码主体)调用修改了函数内部的变量的值,当以后第二个(代码主体)调用访问该函数的时候,第一个调用对函数中变量的值做的任何修改都不会反映出来,变量原来的值没有变化 2、变量是有作用域的,作用域是指有效的代码区域。有局部作用域的变量只存在于一个函数中,不能在函数的外部使用;有全局作用域的变量的值不仅可以在调用的代码中使用,还可以在页面的任何一部分使用 3、局部变量只在部分页面上有效,对页面上的其他部分没有影响,这对提高性能有一定的作用。因为.NET运行的时候只需要跟踪它很短的时间,不需要在页面的整个生命周期内跟踪它,所以耗费的资源比较少。当函数使用完(局部)变量后,内存就被释放 | ||||
局部变量 |
1、在每次外部调用该函数的时候,函数中的变量的值根据传入的参数的值进行计算(处理),计算(处理)结束后,函数将返回值传回调用代码(主体)。此时已执行到函数外部,函数内的变量已经被释放。当下一次调用到来的时候,函数又会根据新的参数的值,计算出新的返回值并返回给调用代码,然后再次释放函数中变量的值 2、不能在同一个作用域中两次创建同一个变量,即不能在同一个作用域中有两个同名的变量 3、块级局部变量:具有块级作用域,表示在一个代码块中定义的变量只在界定该代码块范围的{}中有效。这样的代码块如:if或else if或else块、switch块、任何循环结构块、try或catch块等 4、过程级局部变量:指的是在函数内定义和初始化的局部变量 | |||||
全局变量 |
1、全局变量需要在所有函数的外部进行声明和初始化 2、全局变量的生命周期从ASP.NET页面的启动开始,一直到该页面结束为止,跨越了脚本中创建的所有函数 | |||||