在C#中新手易犯的典型缺陷

 更新时间:2020年6月25日 11:27  点击:2764

这段时间花了点时间整理了几个新手易犯的典型缺陷(专门针对C#的),但是个人的力量毕竟有限缺陷的覆盖面比较窄,有些缺陷的描述也不够准确,这里先贴出来看看能不能集思广益,收集整理出更多的典型缺陷。目标就是希望刚入门.NET的新手看了之后能少走些弯路。

1 及时释放资源

CLR托管环境扮演了垃圾回收的角色,所以你不需要显式释放已创建对象所占用的内存。但这不意味着你可以忽略所有的使用过的对象。许多对象封装了其 他类型的系统资源(例如,磁盘文件,数据连接,网络端口)。保持这些资源的使用状态会急剧的耗尽系统的资源,削弱性能并且最终导致程序出错。当你打开一个 文件、网络端口或者数据连接时,当你不再使用这些资源时,应该尽快显式释放这些资源。
另外针对资源的操作,一般需要增加异常捕获处理(Try..Catch),这时别忘记在finally中进行资源释放,以确保在捕获异常时也可以正常释放资源。

2 正确停止多线程

FileStream fs = File.Open(…);
Try{…} Finally{ fs.Close;}

假设如上代码在工作线程中,已经进行到finally里面,这个时候UI线程调用了该线程的Abort()方法,则很有可能fs.Close还没有执行的时候,工作线程跳出finally代码块了。这样你的fs就永远不会被Close了。
大多数情况下,finally会永远被被执行,但不包括调用Thread.Abort所引发的ThreadAbortException异常,鉴于此理由,不建议使用Abort。
要正确停止线程,不在于调用者采用了什么行为(不要直接使用Thread.Abort()),而更多依赖于工作线程是否能主动响应调用者的停止请求。
大体机制是,如果线程需要被停止,那么线程自身就应该负责给调用者开放Cancel的接口。

3 类型转换相关

如果从数据库中读取某个值,有数据时是int类型,没有数据的话获取到的是null,类型强转则会异常。所以一般很少用强转,用的话也必须做一个异常捕获,避免程序异常。

在强转不好的情况下,我们建议使用TryParse方法,该方法已经对Parse方法进行了异常处理。

也可以用Convert,同样需要进行异常捕获;其实,凡是涉及到类型转换,序列化等操作的地方,都需要捕获异常;

4 字符串操作问题

在对字符串操作中,若涉及大量拼接操作建议使用StringBuilder。若使用String会带来明显的性能损耗。原因在于string对象是 个很特殊的对象,它一旦被赋值就不可改变。在运行时调用String类中任何拼接操作(如赋值、”+”等),都会在内存中创建一个新的字符串对象,也意味 着要为该新对象分配新的内存空间。

5 const常量修改导致的问题

当程序引用其他dll中的const常量时要特别引起注意。
若修改了此dll中的const常量后,要重新编译引用了此dll中这个const常量的所有程序,否则程序中使用的这个常量值将和dl中的不一致。
另外如果使用readonly代替const可以解决这个问题,不需要重新编译,因为const是编译型常量,而readonly是运行时常量。

6 C#编译目标平台问题

当程序依赖的dll的编译的目标平台是X86,则程序本身的编译目标平台也必须是X86(而不是默认选项Any CPU),否则64位电脑将无法运行。

7 跨线程访问控件

在开发界面程序时,会遇到比较耗时的操作,为了程序的友好性,我们一般会在任务线程中执行耗时操作,并将执行信息显示在主UI线程。
假如直接在任务线程中操作主UI线程中的控件,这样极易出现异常,报“不能在其他线程中修改创建控件线程的值”,如果设置了禁止编译器对跨线程访问做检查,就不会报错,但是会出现无法预知的问题。此时建议采用委托或匿名委托的方式实现。

以上就是总结了7种新手易犯的典型缺陷,希望对大家的学习有所帮助。

[!--infotagslink--]

相关文章

  • C#实现简单的登录界面

    我们在使用C#做项目的时候,基本上都需要制作登录界面,那么今天我们就来一步步看看,如果简单的实现登录界面呢,本文给出2个例子,由简入难,希望大家能够喜欢。...2020-06-25
  • 浅谈C# 字段和属性

    这篇文章主要介绍了C# 字段和属性的的相关资料,文中示例代码非常详细,供大家参考和学习,感兴趣的朋友可以了解下...2020-11-03
  • C#中截取字符串的的基本方法详解

    这篇文章主要介绍了C#中截取字符串的的基本方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2020-11-03
  • C#连接SQL数据库和查询数据功能的操作技巧

    本文给大家分享C#连接SQL数据库和查询数据功能的操作技巧,本文通过图文并茂的形式给大家介绍的非常详细,需要的朋友参考下吧...2021-05-17
  • C#实现简单的Http请求实例

    这篇文章主要介绍了C#实现简单的Http请求的方法,以实例形式较为详细的分析了C#实现Http请求的具体方法,需要的朋友可以参考下...2020-06-25
  • C#中new的几种用法详解

    本文主要介绍了C#中new的几种用法,具有很好的参考价值,下面跟着小编一起来看下吧...2020-06-25
  • 使用Visual Studio2019创建C#项目(窗体应用程序、控制台应用程序、Web应用程序)

    这篇文章主要介绍了使用Visual Studio2019创建C#项目(窗体应用程序、控制台应用程序、Web应用程序),小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧...2020-06-25
  • C#开发Windows窗体应用程序的简单操作步骤

    这篇文章主要介绍了C#开发Windows窗体应用程序的简单操作步骤,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2021-04-12
  • C#从数据库读取图片并保存的两种方法

    这篇文章主要介绍了C#从数据库读取图片并保存的方法,帮助大家更好的理解和使用c#,感兴趣的朋友可以了解下...2021-01-16
  • C#和JavaScript实现交互的方法

    最近做一个小项目不可避免的需要前端脚本与后台进行交互。由于是在asp.net中实现,故问题演化成asp.net中jiavascript与后台c#如何进行交互。...2020-06-25
  • C++调用C#的DLL程序实现方法

    本文通过例子,讲述了C++调用C#的DLL程序的方法,作出了以下总结,下面就让我们一起来学习吧。...2020-06-25
  • 轻松学习C#的基础入门

    轻松学习C#的基础入门,了解C#最基本的知识点,C#是一种简洁的,类型安全的一种完全面向对象的开发语言,是Microsoft专门基于.NET Framework平台开发的而量身定做的高级程序设计语言,需要的朋友可以参考下...2020-06-25
  • C#变量命名规则小结

    本文主要介绍了C#变量命名规则小结,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...2021-09-09
  • C#绘制曲线图的方法

    这篇文章主要介绍了C#绘制曲线图的方法,以完整实例形式较为详细的分析了C#进行曲线绘制的具体步骤与相关技巧,具有一定参考借鉴价值,需要的朋友可以参考下...2020-06-25
  • C# 中如何取绝对值函数

    本文主要介绍了C# 中取绝对值的函数。具有很好的参考价值。下面跟着小编一起来看下吧...2020-06-25
  • c#自带缓存使用方法 c#移除清理缓存

    这篇文章主要介绍了c#自带缓存使用方法,包括获取数据缓存、设置数据缓存、移除指定数据缓存等方法,需要的朋友可以参考下...2020-06-25
  • c#中(&&,||)与(&,|)的区别详解

    这篇文章主要介绍了c#中(&&,||)与(&,|)的区别详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2020-06-25
  • 经典实例讲解C#递归算法

    这篇文章主要用实例讲解C#递归算法的概念以及用法,文中代码非常详细,帮助大家更好的参考和学习,感兴趣的朋友可以了解下...2020-06-25
  • C#学习笔记- 随机函数Random()的用法详解

    下面小编就为大家带来一篇C#学习笔记- 随机函数Random()的用法详解。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧...2020-06-25
  • C#中list用法实例

    这篇文章主要介绍了C#中list用法,结合实例形式分析了C#中list排序、运算、转换等常见操作技巧,具有一定参考借鉴价值,需要的朋友可以参考下...2020-06-25