在C#中新手易犯的典型缺陷
作者:lijiao 发布时间:2023-08-26 01:24:20
这段时间花了点时间整理了几个新手易犯的典型缺陷(专门针对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线程中的控件,这样极易出现异常,报“不能在其他线程中修改创建控件线程的值”,如果设置了禁止编译器对跨线程访问做检查,就不会报错,但是会出现无法预知的问题。此时建议采用委托或匿名委托的方式实现。
猜你喜欢
- android提供的工具链和开发工具比较完善,因此它的开发环境的搭建比较简单,相信许多朋友都已经搭建好环境,并编写了HelloA
- 本文主要带大家看看Object类中一些常用方法的API文档的介绍和JDK中的源码。1.equals方法1.API中equals方法的介绍2.
- 本文以实例形式展示了C#判等对象是否相等的常用方法,非常实用,可供大家参考借鉴之用。具体分析如下:一、判断相等的3个方法1.实例方法publ
- 本文实例为大家分享了微信小程序支付C#后端源码,供大家参考,具体内容如下using System;using System.Collecti
- 测试是开发的一个非常重要的方面,可以在很大程度上决定一个应用程序的命运。良好的测试可以在早期捕获导致应用程序崩溃的问题,但较差的测试往往总是
- Java下常见的Json类库有Gson、JSON-lib和Jackson等,Jackson相对来说比较高效,在项目中主要使用Jackson进
- 单例模式大概是所有设计模式中最简单的一种,如果在面试时被问及熟悉哪些设计模式,你可能第一个答的就是单例模式。单例模式的实现分为两种:饿汉式和
- 简介本次五子棋使用的是光标控制移动,通过按空格键(键值32)来落子,实现游戏的。我们额外用到的头文件有:#include<getch.
- struts2可以非常简单地使用FreeMarker模板作为视图技术,对于传统的jsp页面而言,FreeMarker是一个绝佳的替代方案。除
- 源码:class T {int m = 8;}T t = new T();汇编码:0 new #2 <T>3 dup4 invo
- 实例如下:using System;using System.Linq.Expressions;class DynamicPredicate
- 描述项目中用到boot 整合 mybatis-plus , 个人在使用分页条件查询的时候一直查不出 total, pages, 终于找到原因
- 一对多查询一对多关联查询是指在查询一方对象的时候,同时将其所关联的多方对象也都查询出来。下面以班级 Classes 与学生 Student
- 本文实例讲述了C#将布尔类型转换成字节数组的方法。分享给大家供大家参考。具体如下:byte[] b = null;b = BitConver
- 效果:代码:XmlDocument xml = new XmlDocument(); &nbs
- 本文实例讲述了WinForm实现状态栏跑马灯效果的方法。分享给大家供大家参考,具体如下:using System;using System.
- maven没有打包xml文件的问题最近使用maven带管理项目,采用SSM的技术栈,在配置好一些配置文件,打包部署到tomcat上,出现没有
- 给Word文档设置背景时,通常只能针对整篇文档设置统一的背景,如果需要对某些页面单独设置背景,则需要通过另外的方式来实现。本文通过C# 程序
- 在 Flutter 中使用图片是最基础能力之一。作为春节开工后的第一篇文章,17 做了精心准备,满满的都是干货!本文介绍如何在 Flutte
- 1,带Tomcat的打包方式1.1, 在pom.xml文件添加以下配置(目的:自定main入口和跳过Junit代码)<build>