今天,我写了一个读取整数的函数,如下:
static int ReadInt(){ int inputNum; bool IsNumber = false; do { Console.WriteLine("请输入一个整数"); try { inputNum = Convert.ToInt32(Console.ReadLine()); IsNumber = true; return inputNum; } catch { Console.WriteLine("您的输入有误"); } } while (IsNumber==false); }
结果编译错误,错误列表显示:并非所有代码路径都有返回值。
就这样一个小小的问题就将我给困住了。虽然我懂得存在代码执行流程这么回事(控制流),但是写代码的时候就是联系不上理论知识,理所当然得忽略基础知识。最后我们家何同学告诉:程序中 当执行到try{IsNuber=true;}时候,就跳出循环,没有执行return语句。所以函数就没有返回值。我这才明白过来,我怎么就没想过程序的执行流程呢?于是,我就改了下代码:
static int ReadInt(){ int inputNum; bool IsNumber = false; do { Console.WriteLine("请输入一个整数"); try { inputNum = Convert.ToInt32(Console.ReadLine()); IsNumber = true; } catch { Console.WriteLine("您的输入有误"); } } while (IsNumber==false); return inputNum; }
结果编译又有错误,错误列表为:使用了为赋值的局部变量“inputNum”。我又成了丈二的和尚摸不着头脑。认为,明明inputNum变量在try里赋值了,怎么会没赋值呢?最后终于顿悟:若是我们输入一个非整数,程序会跳过Try语句,直接执行catch子句,这时候,inputNum就没有被赋值了。所以我将代码改成了:
static int ReadInt(){ int inputNum=0; bool IsNumber = false; do { Console.WriteLine("请输入一个整数"); try { inputNum = Convert.ToInt32(Console.ReadLine()); IsNumber = true; } catch { Console.WriteLine("您的输入有误"); } } while (IsNumber==false); return inputNum; }
那这次就对了。
那其实更简洁的代码是:
static int ReadInt(){ do { Console.WriteLine("请输入一个整数"); try { int inputNum = Convert.ToInt32(Console.ReadLine()); return inputNum; } catch { Console.WriteLine("您的输入有误"); } } while (true); }
从这次的错误当中,我学到了写代码之前要根据我们所需要实现的功能,设计好代码实现的流程。必须清楚代码的执行流程。不能没有步骤,笼统地将代码放在一块,而不去理会事情的先后顺序。
(题外话:本人自学.Net开发技术,学习的大纲是以传智播客的网上视频教程为主,以及《headFires》等书籍为辅。整个教程从c#基础、面向对象编程、wpf、数据绑定和数据库基础、ADO.Net、html、javascript、JQuery、Ajax、ASP.Net都基本学完,并进行了总结和梳理。但最近找工作,简历都石沉大海,有去那么两三家公司面试,可能是因为项目经验欠缺,被拒了。后来去申请了黑马程序员培训班,现流程还未走完。在黑马群里,通过与他人交流,我发现我有一些重点知识有待加强,而且《c#基础知识加强》我没有学到过,因为之前不知道有渠道可以下载到,所以委托,接口,泛型等等都是通过看书来学习的,但是书本的知识主要偏重概念。很高兴最近下载到了《c#基础知识加强》视频。今天已经开始学习。以上的这个简单函数,其实之前在学习c#基础课程的时候,也是自己已经完成了的一个作业,但其实并没有透彻掌握基础,只是马马虎虎完成了作业,我想因此,留下了不少模糊问题吧。对此深感惭愧,又因为只是学过一遍,后期的课程当中讲解的知识点其实涉及的这方面的编程并不多,再加上没什么项目经验,所以现阶段算是对.Net开发有个系统全面的了解而已,并没有深入。所以任重而道远那。)
附图1:
附图2: