C#几个经常犯错误汇总.docx_第1页
C#几个经常犯错误汇总.docx_第2页
C#几个经常犯错误汇总.docx_第3页
C#几个经常犯错误汇总.docx_第4页
C#几个经常犯错误汇总.docx_第5页
已阅读5页,还剩1页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

在我们平常编程中,时间久了有时候会形成一种习惯性的思维方式,形成固有的编程风格,但是有些地方是需要斟酌的,即使是一个很小的错误也可能会导致昂贵的代价,要学会善于总结,从错误中汲取教训,尽量不再犯同样错误,注重编程之美,代码的优雅,总结几个平常经常犯的错误。1、在C#编程中,字符型类型是最容易处理出错的地方,代价是非常昂贵,在.Net Framwork中,字符串是一个相当特别的引用类型,string本省就是一个不可继承的密封类,但是它具有了值类型所应用的特点,但是它在CLR中内 存还是保存于托管堆之上,也就是说,当我们每次定义一个字符串类型的时候,就在堆内存中开辟一端内存,而当我们字符串被修改之后,它会创建一个新的内存, 注意这里的内存是不连续的,而是通过修改栈内地址引用而拼凑字符串,不会改变源字符串在内存中的地址,所以有些程序员总是喜欢使用这样的方法格式化字符 串:string SelectText=select * from +TableName+ where UserName=+Name+;上述代码,使用了字符串拼凑的方法,因为使用了多重串联,因此会在内存中创建两个不必要的字符串垃圾副本。其实在C#中,已经为我们提供了StringBuilder和String.Fromat来解决此问题,虽然他们可以实现同样的功能,但是他们有质 的变化,StringBuilder在内存中开辟的是一段连续内存,当增加新字符串时候,它会在栈中指向的同一个堆内存中连续存放字符,这就形成了性能的 提升。所以我们将上面代码改成:string SelectText=string.Format(select * from 0 where UserName=1,TableName,Name);2、大多数开发人员都不知道内置的验证数据类型的方法,如System.Int32,因此很多人都是自己实现的,其实这是不妥的,因为这些基本类型中都存在自己固有的类型验证方法,下面这个就是自己实现验证的一个字符串是否是数值的代码:public bool CheckIfNumeric(string value) bool IsNumeric=true; try int i=Convert.ToInt32(value); catch(FormatException excepiton) IsNumeric=false; return IsNumeric;复制代码虽然使用了try catch语句,这不是最佳的做法,更好的方法是下面使用Int.TryParse;int output=0;bool IsNumeric=int.TryParse(value,out output);复制代码int.TryParse是更快、更简洁的方法。3、自己利用IDisposable接口手动释放内存在.NET Framework中,对象的处理和使用一样重要,理想的方法是在使用完对象的时候,在类中实现IDisposable接口中的dispose方法进行内 存的释放,当然在.Net本身提供的垃圾回收机制(GC)中就提供了这样的功能,在我们实例化类对象时,在类本身的析构函数中会调用dispose方 法,GC在各级内存堆满的情况下,自动检查对象使用情况,去相应的释放内存,但是运行在非托管平台上的方法,需要我们自己手动释放内存,比如我们常见的 SqlConnection对象,也就有了下面的创建、使用和处理方法:public void DALOneMethod() SqlConnection connection=null; try connection =new SqlConnection(。); connection.Open(); /sqlcommand。run catch(Exception exception) / manager exception finally connection.Close(); connection.Disopse(); 复制代码上述代码是大部分程序员会出现的代码,乍看没啥问题,连接处理在最后一个代码中被明确调用,但是如果发生了一个异常,catch代码块就被执行,然 后再执行最后一个代码块处理连接,因此在最后一个代码块执行之前,连接将一直留在内存中,大部分我们会在此处记录错误,一般涉及到IO操作,如果延时时间 比较长的话,这个连接将在内存时间长时间停留。我们一个原则就是当对象不再使用的时候我们里面释放资源。我们采用程序逻辑域来处理这个问题会更好:public void DALOneMethod() using(SqlConnction connection=new SqlConnection(。) connction.Open(); / do SUAD 复制代码当使用using代码快时,对象上的dispose()方法将在执行推出逻辑域的时候调用,这样就保证了SqlConnection的资源处理被尽 早释放,当然这个方法也适用于实现IDisposable接口的类,当时个人不推荐这样做,在非常有把握的情况下可以手动释放,但是没把握还是叫 给.net系统释放,因为本身类的析构函数就实现这个方法,当我们自己重写后,反而会导致系统误以为你自己定义了方法,而推迟释放资源,有兴趣可以研究下 GC运行本质,假如能在第一代被释放的内存,如果我们重写dispose方法反而推迟到第二代内存堆中释放,显然是不可取的。4、学会合理的管理公共变量,我们在系统中经常会滥用公共变量,没有做到合适的封装好。static void Main(string args) MyAccount account=new MyAccount(); /这地方不能随便的调用account里面的字段进行更改,但是缺改了 account.AccountNumber=ddddddddd; Console.ReadKey();public class MyAccount public string AccountNumber; public MyAcctount() AccountNumber=ssssssssssssss; 复制代码 在上面的MyAccount类中生命了一个AccountNumber公共变量,理想情况下,AccountNumber应该是只读的,不能让外界修改,但是这里MyAccount类却没有对它做任何控制。声明公共做法应该是使用属性,如:public class MyAccount private stirng _accountNumber; public string AccountNumber get return _accountNumber; public MyAccount() _accountNumber=dddddddd; 复制代码这里我们封装了AccountNumber公共变量,它变成了只读,不能由调用者类进行修改。5、嵌套的异常处理,有的开发人员喜欢在方法末尾加上处理的嵌套方法,如public class NestedExceptionHandling public void MainMethod() try /some implementation ChildMethod1(); catch (Exception exception) /Handle exception private void ChildMethod1() try /some implementation ChildMethod2(); catch (Exception exception) /Handle exception throw; private void ChildMethod2() try /some implementation catch (Exception exception) /Handle exception throw; 复制代码如果相同的异常被处理多次,性能开销将会增加。我们的解决方法是让异常处理方法独立开来,如:public class NestedExceptionHandling public void MainMethod() try /some implementation ChildMethod1(); catch(Exception exception) /Handle exception private void ChildMethod1() /some implementation ChildMethod2(); private void ChildMethod2() /some implementation 复制代码6、大数据量上使用Dataset和DataReader混用,当单表数据量很大的情况,使用DataSet是一种很不明智的选择,应为 DataSet是以DataTable内存形式存放数据

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论