Break 、Continue 和ReadOnly、Const和Ref和Out params

Break和Continue区别

之前对于Break和Continue;ReadOnly和Const;ref和out,params之类的基础东东学习过,但是一直没有仔细去研究到底是怎么一回事儿,最近在开发中用到了,仔细来做个总结:

1、Break和Continue

//break是跳出整个循环体,不再执行本循环,continue是结束单次循环,继续下一次循环。 //更多问题 联系QQ 931697811(夜雨梧桐)

 1  #region Break测试
 2
 3             Console.WriteLine("========Break========");
 4             int x = 0;
 5             while (x++ < 20)
 6             {
 7                 if (x == 3)
 8                 {
 9                     break;
10                 }
11                 Console.WriteLine("{0}\n",x);
12             }
13             #endregion

 1  #region Continue测试
 2             Console.WriteLine("========Continue========");
 3             int k = 0;
 4             while (k++ < 10)
 5             {
 6                 if (k == 3)
 7                 {
 8                     continue;
 9                 }
10                 Console.WriteLine("{0}\n",k);
11             }
12             #endregion

2、ReadOnly和Const

//有问题:联系QQ 931697811

1. const修饰的常量在声明的时候必须初始化;readonly修饰的常量则可以延迟到构造函数初始化

2. const修饰的常量在编译期间就被解析,即常量值被替换成初始化的值;readonly修饰的常量则延迟到运行的时候

3. 此外const常量既可以声明在类中也可以在函数体内,但是static readonly常量只能声明在类中。

 1  #region ReadOnly
 2         static readonly int A = B * 10;
 3         static readonly int B = 10;
 4
 5         const int j = k * 10;
 6         const int k = 10;
 7
 8         static void Main(string[] args)
 9         {
10             Console.WriteLine("===Readonly输出的值是:===");
11             Console.WriteLine("A is {0}.B is {1}", A, B);
12             Console.WriteLine("===Const输出的值是:===");
13             Console.WriteLine("j is {0}.k is {1}", j, k);
14             Console.ReadKey();
15         }
16         #endregion

3、ref和out,params

问题的引出:

现需要通过一个叫Swap的方法交换a,b两个变量的值。交换前a=1,b=2,断言:交换后a=2,b=1

现编码如下:

 1  1class Program
 2  2    {
 3  3        static void Main(string[] args)
 4  4        {
 5  5            int a = 1;
 6  6            int b = 2;
 7  7            Console.WriteLine("交换前\ta={0}\tb={1}\t",a,b);
 8  8            Swap(a,b);
 9  9            Console.WriteLine("交换后\ta={0}\tb={1}\t",a,b);
10 10            Console.Read();
11 11        }
12 12        //交换a,b两个变量的值
13 13        private static void Swap(int a,int b)
14 14        {
15 15            int temp = a;
16 16            a = b;
17 17            b = temp;
18 18            Console.WriteLine("方法内\ta={0}\tb={1}\t",a,b);
19 19        }
20 20    }

运行结果:

交换前  a = 1    b = 2

方法内  a = 2    b = 1

交换后  a = 1    b = 2

并未达到我们的需求!

原因分析:int类型为值类型,它存在于线程的堆栈中。当调用Swap(a,b)方法时,相当于把a,b的值(即1,2)拷贝一份,然后在方法内交换这两个值。交换完后,a还是原来的a,b还是原来的b。这就是C#中按值传递的原理,传递的是变量所对应数据的一个拷贝,而非引用。

修改代码如下即可实现我们想要的结果:

 1 class Program
 2  2    {
 3  3        static void Main(string[] args)
 4  4        {
 5  5            int a = 1;
 6  6            int b = 2;
 7  7            Console.WriteLine("交换前\ta={0}\tb={1}\t",a,b);
 8  8            Swap(ref a,ref b);
 9  9            Console.WriteLine("交换后\ta={0}\tb={1}\t",a,b);
10 10            Console.Read();
11 11        }
12 12        //交换a,b两个变量的值
13 13        private static void Swap(ref int a, ref int b)
14 14        {
15 15            int temp = a;
16 16            a = b;
17 17            b = temp;
18 18            Console.WriteLine("方法内\ta={0}\tb={1}\t",a,b);
19 19        }
20 20    }

1 关于重载

原则:有out|ref关键字的方法可以与无out和ref关键字的方法构成重载;但如想在out和ref间重载,编译器将提示:不能定义仅在ref和out的上的方法重载

2 关于调用前初始值

原则:ref作为参数的函数在调用前,实参必须赋初始值。否则编译器将提示:使用了未赋值的局部变量;

          out作为参数的函数在调用前,实参可以不赋初始值。

3 关于在函数内,引入的参数初始值问题

原则:在被调用函数内,out引入的参数在返回前至少赋值一次,否则编译器将提示:使用了未赋值的out参数;

在被调用函数内,ref引入的参数在返回前不必为其赋初值。

总结:C#中的ref和out提供了值类型按引用进行传递的解决方案,当然引用类型也可以用ref和out修饰,但这样已经失去了意义。因为引用数据类型本来就是传递的引用本身而非值的拷贝。ref和out关键字将告诉编译器,现在传递的是参数的地址而不是参数本身,这和引用类型默认的传递方式是一样的。同时,编译器不允许out和ref之间构成重载,又充分说明out和ref的区别仅是编译器角度的,他们生成的IL代码是一样的。有人或许疑问,和我刚开始学习的时候一样的疑惑:值类型在托管堆中不会分配内存,为什么可以按地址进行传递呢?值类型虽然活在线程的堆栈中,它本身代表的就是数据本身(而区别于引用数据类型本身不代表数据而是指向一个内存引用),但是值类型也有它自己的地址,即指针,现在用ref和out修饰后,传递的就是这个指针,所以可以实现修改后a,b的值真正的交换。这就是ref和out给我们带来的好处。

关于更多如This,Base等下次再分享

时间: 2024-10-05 04:19:24

Break 、Continue 和ReadOnly、Const和Ref和Out params的相关文章

linux 循环结构中的 break continue exit return区别

1 概述 在脚本的循环中,需要用到break,continue,exit.来控制循环.利用return来获取函数的返回值.本文将对这四个命令的使用做介绍 break [N]:提前结束第N层循环,最内层为第1层 continue [N]:提前结束第N层的本轮循环,而直接进入下一轮判断:最内层为第1层 exit 命令终止脚本 2  break continue exit   对比 2.1 break 和continue 测试 假设一个循环体内,总共嵌套了3层循环,总循环体N为3,break 和con

[第三节] Python流程控制语句 - if, while, for, break, continue

目录: 一. 条件判断语句 - if 二. 循环语句 - while & for 三. break & continue语句. 四. 练习题 正文: 一, 条件判断语句 - if: 1) 第一种语法: if 条件:      代码块 2) 第二种语法: if 条件:      内容一     内容二  else:     内容三      内容四 3) 第三种语法: if 条件1:      代码块  elif 条件2:      代码块  elif 条件3:      代码块  else

js中退出语句break,continue和return 比较

在 break,continue和return 三个关键字中, break,continue是一起的,return 是函数返回语句,但是返回的同时也将函数停止 首先:break和continue两个一起讨论 这两个应用的范围是退出循环或者switch语句,在其他地方使用会导致错误: break:由于它是用来退出循环或者switch语句,所以只有当它出现在这些语句时,这种形式的break语句才是合法的. 举例: for(var i=1;i<=10;i++) { if(i==6) { break;

js中退出语句break,continue和return 比较 (转载)

在 break,continue和return 三个关键字中, break,continue是一起的,return 是函数返回语句,但是返回的同时也将函数停止 首先:break和continue两个一起讨论 这两个应用的范围是退出循环或者switch语句,在其他地方使用会导致错误: break:由于它是用来退出循环或者switch语句,所以只有当它出现在这些语句时,这种形式的break语句才是合法的. 举例: for(var i=1;i<=10;i++) { if(i==6) { break;

C#break ,continue, return区别详解 [转载]

C#编程语法中break ,continue, return这三个常用的关键字的学习对于我们编程开发是十分有用的,那么本文就向你介绍break ,continue, return具体的语法规范. C#编程语法中我们会碰到break ,continue, return这三个常用的关键字,那么关于这三个关键字的使用具体的操作是什么呢?我们在使用这三关键字的时候需要注意和需要理解的规则是什么呢?让我们开始介绍吧: 一.C#编程语法之break语句: break语句会使运行的程序立刻退出包含在最内层的循

[java学习笔记]java语言基础概述之转义字符&amp;break&amp;continue

1.转义字符 \t:制表符 \n:回车 \b:退格 \r:回车 \":双引号 \\:反斜线(常用于文件路径的书写中)   windows系统中回车符其实是由两个符号组成的,\r\n linux系统中回车符是\n 2.break&continue break(跳出)语句:应用范围是选择结构(switch语句)和循环结构 continue(继续)语句:应用于循环结构 注意: 这两个语句离开应用范围是没有意义的,编译会报错. 这两个语句单独存在下面都不可以有语句,因为执行不到.一般使用if判断

PHP100-第五讲 PHP5.4 的while / for / break / continue、PHP5.4 的系统函数和自定义函数

PHP5.4 的while / for / break / continue.PHP5.4 的系统函数和自定义函数 论坛交流:http://bbs.php100.com/read-htm-tid-150407.html PHP5.4 的while / for / break / continue 在PHP编写代码时,我们经常需要让相同的代码块运行很多次.这时候就可以在代码中使用循环语句来完成这个任务.PHP的循环结构类似C中模式,有while.do-while.for PHP5.4 的系统函数和

详解C#break ,continue, return

C#编程语法中break ,continue, return这三个常用的关键字的学习对于我们编程开发是十分有用的,那么本文就向你介绍break ,continue, return具体的语法规范. C#编程语法中我们会碰到break ,continue, return这三个常用的关键字,那么关于这三个关键字的使用具体的操作是什么呢?我们在使用这三关键字的时候需要注意和需要理解的规则是什么呢?让我们开始介绍吧: 一.C#编程语法之break语句: break语句会使运行的程序立刻退出包含在最内层的循

js中的break ,continue, return (转)

面向对象编程语法中我们会碰到break ,continue, return这三个常用的关键字,那么关于这三个关键字的使用具体的操作是什么呢?我们在使用这三关键字的时候需要注意和需要理解的规则是什么呢?让我们开始介绍吧: js编程语法之break语句: break语句会使运行的程序立刻退出包含在最内层的循环或者退出一个switch语句. 由于它是用来退出循环或者switch语句,所以只有当它出现在这些语句时,这种形式的break语句才是合法的. 如果一个循环的终止条件非常复杂,那么使用break语