Break和Continue区别

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

1、Break和Continue

break是跳出整个循环体,不再执行本循环,

continue是结束单次循环,继续下一次循环

 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

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给我们带来的好处。

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

  1. js中的break ,continue, return (转)

    面向对象编程语法中我们会碰到break ,continue, return这三个常用的关键字,那么关于这三个关键字的使用具体的操作是什么呢?我们在使用这三关键字的时候需要注意和需要理解的规则是什么呢? ...

  2. break,continue的使用

    break,continue 使用break命令允许跳出所有循环下面的例子中,脚本进入死循环直至用户输入数字大于5.要跳出这个循环,返回到shell提示符下,就要使用break命令. #!/bin/b ...

  3. 详解C#break ,continue, return

    C#编程语法中break ,continue, return这三个常用的关键字的学习对于我们编程开发是十分有用的,那么本文就向你介绍break ,continue, return具体的语法规范. C# ...

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

    在 break,continue和return 三个关键字中, break,continue是一起的,return 是函数返回语句,但是返回的同时也将函数停止 首先:break和continue两个一 ...

  5. break , continue , exit

    break , continue , exit 例一:#!/bin/bash . /etc/init.d/functions `;do ];then #continue #没有数字3 break #e ...

  6. 有关于break,continue,return的区别和代码分析

    今天,用代码和结果直接解释break,continue,return的区别 1.break代码 public static void breakTest() { //break的讲解 for(int ...

  7. Java基础(2):Java中的四个跳转语句总结goto,break,continue,return

    跳转控制语句 Java中的goto是保留字,目前不能使用.虽然没有goto语句可以增强程序的安全性,但是也带来很多不便,比如说,我想在某个循环知道到某一步的时候就结束,现在就做不了这件事情.为了弥补这 ...

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

    js中退出语句break,continue和return 比较 在 break,continue和return 三个关键字中, break,continue是一起的,return 是函数返回语句,但是 ...

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

    1.转义字符 \t:制表符 \n:回车 \b:退格 \r:回车 \":双引号 \\:反斜线(常用于文件路径的书写中)   windows系统中回车符其实是由两个符号组成的,\r\n linu ...

随机推荐

  1. proguard 不混淆第三方jar包的问题

    导入lib文件,并且用-dontwarn 和 keep class结合试试,例如: -libraryjars libs/log4j.jar -dontwarn org.apache.log4j.*-k ...

  2. [Java面试一]Spring总结以及在面试中的一些问题.(转发:http://www.cnblogs.com/wang-meng/p/5701982.html)

    1.谈谈你对spring IOC和DI的理解,它们有什么区别? IoC Inverse of Control 反转控制的概念,就是将原本在程序中手动创建UserService对象的控制权,交由Spri ...

  3. pom.xml配置文件详解(转发)

    setting.xml主要用于配置maven的运行环境等一系列通用的属性,是全局级别的配置文件:而pom.xml主要描述了项目的maven坐标,依赖关系,开发者需要遵循的规则,缺陷管理系统,组织和li ...

  4. iOS 动态修改导航栏颜色 UINavigationBar

    示例 所谓动态修改  意思是 在当前页面滚动的过程中 亦或 是在 触发返回事件\进入一个新的页面  导航栏的动态变化 由于系统级别的navBar 高度集成  很多自己想实现的功能 很不好弄 如果是通过 ...

  5. 每天一个Linux命令(34)grep命令

          grep(global search regular expression(RE) and print out the line,全面搜索正则表达式并把行打印出来)是一种强大的文本搜索工具 ...

  6. 剑指offer——圆圈中最后剩下的数字

    1.如果通过环形列表去模拟圆圈的话,最后时间复杂度为O(mn),而且还需要一个辅助链表来模拟圆圈,空间复杂度为O(n). 2.通过找出递推公式的方法,求得递推公式为 时间复杂度为O(n),空间复杂度为 ...

  7. China sets economic reform priorities for 2015

    BEIJING -- China's State Council, the cabinet, on Monday unveiled this year's priorities for economi ...

  8. linux ps aux 结果解释

    # ps aux | moreUSER       PID  %CPU   %MEM   VSZ    RSS    TTY                   STAT       START    ...

  9. linux 系统监控好文

    摘自: http://os.51cto.com/art/201005/200714_all.htm

  10. 英语发音规则---Y字母

    英语发音规则---Y字母 一.总结 一句话总结: 1.Y字母在单词最前面读发[j]? yes /jes/ [jɛs] n. 是 yard /jɑːd/ [jɑd] n. 院子 yellow /'jel ...