C# 知识点 goto【学习笔记】
2012-03-05 14:15
211 查看
定义
goto 语句将程序控制直接传递给标记语句。
优点:具有了超强的灵活性 弱点:降低代码的可读性。 结构化编程所关注的就是解决单个功能函数内部的功能实现,所强调的是每个函数有“一个入口和一个出口”,而goto语句的使用却似乎违背了这样的准则。 但是,如果我们把goto语句限制在一个函数体内部使用,那么,goto语句还是会带来很多便利的。或许正是由于这一点,C#的缔造者也依然保留了功能强大的goto语句。备注
goto 的一个通常用法是将控制传递给特定的 switch-case 标签或 switch 语句中的默认标签。 goto 语句还用于跳出深嵌套循环。可以考虑使用goto的情形
1.从多重循环中直接跳出 2. 出错时清除资源 3.可增加程序的清晰度的情况。不加限制地使用goto带来的弊端
1.破坏了清晰的程序结构,使程序的可读性变差,甚至成为不可维护的"面条代码" 2.经常带来错误或隐患。它可能跳过了某些对象的构造、变量的初始化、重要的计算等语句示例goto 在 switch 语句中的使用。
// statements_goto_switch.cs using System; class SwitchTest { static void Main() { Console.WriteLine("Coffee sizes: 1=Small 2=Medium 3=Large"); Console.Write("Please enter your selection: "); string s = Console.ReadLine(); int n = int.Parse(s); int cost = 0; switch (n) { case 1: cost += 25; break; case 2: cost += 25; goto case 1; case 3: cost += 50; goto case 1; default: Console.WriteLine("Invalid selection."); break; } if (cost != 0) { Console.WriteLine("Please insert {0} cents.", cost); } Console.WriteLine("Thank you for your business."); } }
示例输出
Coffee sizes: 1=Small 2=Medium 3=Large Please enter your selection: 2 Please insert 50 cents. Thank you for your business.使用 goto 跳出嵌套循环
// statements_goto.cs // Nested search loops using System; public class GotoTest1 { static void Main() { int x = 200, y = 4; int count = 0; string[,] array = new string[x, y]; // Initialize the array: for (int i = 0; i < x; i++) for (int j = 0; j < y; j++) array[i, j] = (++count).ToString(); // Read input: Console.Write("Enter the number to search for: "); // Input a string: string myNumber = Console.ReadLine(); // Search: for (int i = 0; i < x; i++) { for (int j = 0; j < y; j++) { if (array[i, j].Equals(myNumber)) { goto Found; } } } Console.WriteLine("The number {0} was not found.", myNumber); goto Finish; Found: Console.WriteLine("The number {0} is found.", myNumber); Finish: Console.WriteLine("End of search."); } }
示例输出
Enter the number to search for: 44 The number 44 is found. End of search.
Goto语句与结构化程序设计
goto语句问题的提出直接推动了结构化程序设计(structured programming)的思想和程序设计方法学的诞生和发展。结构化程序设计方法引入了工程思想和结构化思想,使大型软件的开发和编程都得到了极大的改善。 结构化程序设计方法的主要原则可以概括为自顶向下,逐步求精,模块化,限制使用goto语句。 1.自顶向下:程序设计时,应先考虑总体,后考虑细节;先考虑全局目标,后考虑局部目标。不要一开始就过多追求众多的细节,先从最上层总目标开始设计,逐步使问题具体化。 2.逐步求精:对复杂问题,应设计一些子目标作为过渡,逐步细化。 3.模块化:一个复杂问题,肯定是由若干稍简单的问题构成。模块化是把程序要解决的总目标分解为子目标,再进一步分解为具体的小目标,把每一个小目标称为一个模块。 4.限制使用goto语句 结构化程序设计方法的起源来自对goto语句的认识和争论。肯定的结论是,在块和进程的非正常出口处往往需要用goto语句,使用goto语句会使程序执行效率较高;在合成程序目标时,goto语句往往是有用的,如返回语句用goto。否定的结论是,goto语句是有害的,是造成程序混乱的祸根,程序的质量与goto语句的数量呈反比,应该在所有高级程序设计语言中取消goto语句。取消goto语句后,程序易于理解、易于排错、容易维护,容易进行正确性证明。作为争论的结论,1974年Knuth发表了令人信服的总结,并证实了: (1)goto语句确实有害,应当尽量避免; (2)完全避免使用goto语句也并非是个明智的方法,有些地方使用goto语句,会使程序流程更清楚、效率更高。 (3)争论的焦点不应该放在是否取消goto语句上,而应该放在用什么样的程序结构上。其中最关键的是,应在以提高程序清晰性为目标的结构化方法中限制使用goto语句
关于goto使用语句的一些建议
1) 使用goto语句只能goto到同一函数内,而不能从一个函数里goto到另外一个函数里。 2) 使用goto语句在同一函数内进行goto时,goto的起点应是函数内一段小功能的结束处,goto的目的label处应是函数内另外一段小功能的开始处。 3) 不能从一段复杂的执行状态中的位置goto到另外一个位置,比如,从多重嵌套的循环判断中跳出去就是不允许的。 4)应该避免像两个方向跳转。这样最容易导致"面条代码"。
资料来源:
http://msdn.microsoft.com/zh-cn/library/13940fs2(VS.80).aspx
http://hi.baidu.com/%B7%C5%D1%F2de%CD%F5%D7%D3/blog/item/e1b6eff2474241354f4aeaa6.html
http://tieba.baidu.com/f?kz=657163938
相关文章推荐
- (原创)c#学习笔记04--流程控制02--goto语句
- C#学习笔记--常规知识点(收集中...)
- C#学习笔记(零碎知识点收集)
- 黑马程序员_C#基础知识学习笔记:变量的使用和命名规则
- C#设计模式学习笔记-单例模式
- 【学习笔记】C#中HashTable和快速排序的用法,从单词频率统计小程序写起
- C#学习笔记---基础入门(一)
- lucene.Net--学习笔记(3)---C#'网络爬虫' 源码详解
- C#学习笔记01:基本数据类型
- CLR via C# 学习笔记(2012/3/13)
- C#学习笔记----事件 自定义事件
- kafka学习笔记:知识点整理(一)
- .net学习笔记-C#语言基础篇2
- C#可扩展编程之MEF学习笔记(一):MEF简介及简单的Demo
- C#学习笔记2——反射
- c#学习笔记之Invoke()作用分析
- JAVA学习笔记之-servlet知识点
- C#学习笔记1
- oracle 学习笔记,零散知识点收集
- C#学习笔记4——扩展方法