高效C#编码优化原则
作者:shichen2014 发布时间:2023-06-13 03:16:23
本文汇总了高效C#编码常见的优化原则,对于进行C#程序设计来说有很大的参考借鉴作用。具体列出如下:
1.foreach VS for 语句
Foreach 要比for具有更好的执行效率
Foreach的平均花费时间只有for的30%.通过测试结果在for和foreach都可以使用的情况下,我们推荐使用效率更高的foreach
另外,用for写入数据时间大约是读取数据时间的10倍左右.
2.避免使用ArrayList
ArrayList的性能低下任何对象添加到ArrayList中都要封箱为System.Object,从ArrayList中取出数据都要拆箱回实际的类型
泛型集合类的高性能,泛型集合是强类型的
3.使用HashTable字典集合
当存放少量数据时建议使用HashTable取代像StringDictionary,NameValueCollection, HybridCollection这样的字典集合
4.为字符串容器声明常量
为字符串容器声明常量,不要直接把字符串封装在双引号””中,避免字符串对象不断在内存中创建和释放.提高字符串对象的访问效率.
//避免
MyObject obj = new MyObject();
obj.Status = “Active”;
//推荐
const string c = “Acive”;
MyObject obj = new MyObject();
obj.Status = c;
5.使用String.Compare()字符串比较
不要使用UpperCase或LowerCase转换字符串的大小写,再进行比较
使用String.Compare()可忽略字符串大小写进行比较
String strTemp = “Active”;
If(String.Compare(strTemp,”active”,true)==0){
Consolt.Write(“Equal”);
}
6.使用StringBuilder字符串拼接
①.String类对象是不可变的(只读),对于String对象的重新赋值,本质是重新创建一个新的String对象并赋予新值给该对象.
②.System.Text.StringBuilder 维护一个长度等于Capacity的字符串(可以看作字符数组),当Capacity长度的字符串不足以容纳结果字符串时,StringBuilder开辟新的长度为经过上面的规则计算好的Capacity的内存区域,将原字符串复制到新的内存区域再进行操作,原字符串区域交给GC回收。因此这里也涉及到内存的分配与回收,使用StringBuilder时最好估算一下所需容量,用这个容量初始化Capacity,提高性能。StringBuilder不能保证所有实例成员都是线程安全的,尽管在类型定义中加入了很多线程安全的控制,如果要确保其线程安全,须手工实现线程同步机制。
7.XPathDocument读取XML文件
如果只是读取XML对象的数据,那么用只读的XPathDocument代替XMLDocument,可以提高性能
8.避免在循环体里声明变量,应该在循环体外声明变量,在循环体内初始化变量
//避免
For(int i=0;i<10;i++){
SomeClass obj = new SomeClass();
//…
}
//推荐
SomeClass obj = null;
For(int i=0; i<10; i++){
obj = new SomeClass();
//…
}
9.捕获指定的异常
捕获异常时,应使用具体的异常类进行捕获,并按照异常所捕获得范围按照由小到大的顺序进行定义不要使用通用的System.Exception
Private void Find(object obj){
try{
Console.write(obj.ToString());
}
catch(ArgumentNullException ane)
{ //… }
catch(ArgumentException ae)
{ //… }
catch(SystemException se)
{ //… }
catch(Exception e)
{ //… }
}
不要使用Exception控制流程,捕获异常对性能的损耗是众所周知的.因此最好能够避免异常的发生
10.使用using和try/finally清理资源
.NET 平台在内存管理方面提供了GC(Garbage Collection),负责自动释放托管资源和内存回收的工作,但它无法对非托管资源进行释放,这时我们必须自己提供方法来释放对象内分配的非托管资源
使用非托管资源的类型必须实现IDisposable接口的Dispose方法来精确的释放资料
当使用带有Dispose方法的类型化资源时,应在使用完毕时调用Dispose方法,及时释放掉不用的资源.
使用using或try/finally能更好的保证Dispose方法被及时的调用
11.避免滥用反射
反射是比较浪费性能的操作,应避免滥用反射
影响性能的原因:
当使用反射来调用类型或触发方法,访问字段属性时,CLR需要做更多的工作:校验参数,检查权限等.
当编写一个动态构造类型(晚绑定)的应用时,可采取以下方式进行替换
通过类的继承关系
通过接口实现
通过委托实现
12.避免装箱操作
使用值类型的ToString方法避免装箱操作
原因:数字和字符串拼接的时候,因为数据类型不同,数字通过装箱操作转换为引用类型后才能与字符串进行拼接.
//建议
int num=5;
string str = “link me”+num.ToString();
13.HttpServerUtility.Transfer
采用 Server.Transfer 语法,在页面中使用该方法可避免不必要的客户端重定向(Response.Redirect)。
Int32.TryParse()
类型转化Int32.TryParse()优于Int32.Parse()优于Convert.ToInt32()
Convert.ToInt32 会把最终的解析工作代理给Int32.Parse
Int32.Parse 会把最终的解析工作代理给Number.ParseInt32
Int32.TryParse 会把最终的解析工作代理给Number.TryParseInt32
相信本文所述的C#优化原则能够对大家的C#程序设计起到一定的借鉴作用。


猜你喜欢
- 关于Context我们首先应该知道:(1)它描述的是一个应用程序环境的信息,即上下文。(2)该类是一个抽象(abstract class)类
- 如题,记录一些平常开发用的pom文件细节1.使用parent父类引用,解决依赖版本号不确定时自动匹配的问题<parent> &n
- 前言最近,在给项目组使用Spring搭建Java项目基础框架时,发现使用Spring提供的BeanPostProcessor可以很简单方便地
- TextView加载字体包在 Android 中,若需要使得某个TextView加载字体包,使用以下方式即可: Typeface typeF
- Android 设置Edittext获取焦点并弹出软键盘/** * EditText获取焦点并显示软键盘 */
- 因为公司业务需求,需要在Windows系统下调用摄像头识别二维码需求,就有了这个功能。我根据网上网友提供的一些资料,自己整合应用到项目中,效
- Kotlin的控制流与其他语言一样,顺序,分支,循环顺序语句就不多说,分支有两种,if-else和when(类似于Java中的switch)
- 本文分享的示例代码实现提取2个集合中相同和不同的元素此处需要使用Collection集合所提供的一个方法:removeAll(Cellect
- 本文介绍了详解WMI RPC 服务器不可用的解决方案,分享给大家,具体如下:ConnectionOptions connectionOpti
- 本文实例为大家分享了RecyclerView实现滑动删除的具体代码,供大家参考,具体内容如下package com.example.demo
- 1、首先,找到 Android SDK 在本机中的位置,如果不知道,可以通过在 Android Studio 找到,如下:2、其次,通过 c
- Mybatis 复杂对象resultMap数据对象含有普通属性,一对一对象,一对多对象(2种情况:单一主键和复合主键)下面是resultMa
- 并查集就是将原本不在一个集合里面的内容合并到一个集合中。在实际的场景中用处不多。除了出现在你需要同时去几个集合里面查询,避免出现查询很多次,
- C# 利用代理爬虫网页实现代码:// yanggang@mimvp.com// http://proxy.mimvp.com// 2015-
- 本文实例为大家分享了Android自定义弹框Dialog效果的具体代码,供大家参考,具体内容如下1.dialog_delete.xml<
- 初次安装Android Studio,遇到了不少问题,这是其中的一个,分享如下,同时求各位dalao关注一下啦((*^__^*) )使用不同
- 参考文章Android中实时获取音量分贝值详解:https://www.jb51.net/article/64806.htmpublic c
- 本文实例讲述了C#使用Ado.Net更新和添加数据到Excel表格的方法。分享给大家供大家参考。具体分析如下:微软NET提供了一个交互的方法
- Android activity和view判断滑动 实例代码://手
- 根据上下文环境,Java 的关键字 final 的含义有些微的不同,但通常它指的是“这是不能被改变的”。防止改变有两个原因:设计或效率。因为