提高C#质量与性能

这篇随笔,用来记录提高C#质量和性能的方法。


基本

使用字符串应避免两种性能开销。

1.确保尽量少的装箱:值类型转换引用类型,会进行装箱操作。但是值类型的ToString(),是非托管方法,直接操作内存进行转换。故此不会进行装箱操作。9.ToString() 性能高于 string s = 9;

2.避免分配额外的内存空间:因字符串不可变性,对字符串进行任何操作或运算都会创建新对象,需要分配新的内存空间。使用常量进行+ 拼接,不会分配内存空间。尽量使用StringBuilder。string.Format方法在内部使用StringBuilder进行字符串的格式化。

默认转型方法:大部分情况下需要对FCL提供的类型进转型时,都应该使用FCL提供的转型方法。

1.使用类型的转换运算符:分为两类 隐式转换、显示转换。基元类型普遍都提供了转换运算符。

2.使用类型内置的方法:Parse、TryParse、ToString、ToDouble、TODateTime等

3.使用帮助类提供的方法:System.Convert、System.BitConverter

4.使用CLR支持的转型:子类转换成父类,支持隐式转换。父类转换成子类,必须显示转换。

强制转型与as、is

类型与类型之间的强制转型,存在两种互斥的事情

1.彼此依靠转换操作符来完成两个类型之间的转型。如果存在转换操作符,则应使用显式转换或隐式转换。

2.基类与派生类。如果是基类转为子类本身,应该使用as 操作符。使用is 操作符,可以判断是否能转换。从效率上讲 as 操作符,优先于强制转换。

TryParse比parse好:如果可能引发异常,TryParse的效率远大于Parse。如果方法异常会带来明显的性能损耗时,使用TryParse。

数据库写入中,使用int? 来保证值类型可为空。因数据库字段 存在非必填的情况。而值类型不能为null。使用??运算符进行可空类型的赋值:int? i = 123; int j = i ?? 0;

const 效率高于 readonly。const是编译时的常量,readonly是运行时的常量。

开发过程中,应习惯于使用重载操作符的这一特性。例如:重载+操作符,比使用Add方法更加一目了然。

int x = 1; int y = 2;
int total = int.Add(x, y);
int total = x + y;

创建对象需要考虑是否自定义排序

public sealed class Program
    {
        static void Main(string[] args)
        {
            List<Salary> companySalary = new List<Salary>
            {
                new Salary{ Name="M",BaseSalary=3000,Bouns = 1000},
                new Salary{ Name="R",BaseSalary=2000,Bouns = 4000},
                new Salary{ Name="J",BaseSalary=1000,Bouns = 6000},
            };
            companySalary.Sort(); //使用默认比较器,就是集成IComparable接口的比较器
            companySalary.Sort(new BonusComparer()); //使用自定义比较器
            foreach (Salary item in companySalary)
            {
                Console.WriteLine(item.Name);
            }
            Console.ReadLine();
        }
    }

    public class Salary : IComparable<Salary>
    {
        public string Name { get; set; }
        public int BaseSalary { get; set; }
        public int Bouns { get; set; }

        public int CompareTo(Salary other)
        {
            return BaseSalary.CompareTo(other.BaseSalary);
        }
    }

    public class BonusComparer : IComparer<Salary>
    {
        public int Compare(Salary x, Salary y)
        {
            return x.Bouns.CompareTo(y.Bouns);
        }
    }

可以设置默认比较器,也可以设置自定义比较器。继承接口以后,可以进行定义排序操作。

对于值类型,如果类型的值相等,就应该返回True。

对于引用类型,如果类型指向同一个对象,则返回True。但string是一个特殊引用类型,他的比较被重载为针对 类型的值 的比较。而不是针对引用本身。

浅拷贝:将对象中所有的字段复制到新的对象中,值类型不会影响到元对象。引用类型会。浅拷贝会将基元类型string,也进行深拷贝。

深拷贝:将对象中所有的字段赋值到新的对象中。无论是值类型还是引用类型,都会重新赋值。

使用dynamic来简化反射

dynamic dy = Activator.CreateInstance(Type.GetType("ConsoleApplication1.DynamicSample"));
Console.WriteLine(dy.Add(1,2));

使用dynamic效率会比普通反射高很多。不过dynamic没有智能提示。推荐如果需要反射,则使用dynamic来进行。


集合和LINQ

元素数量可变的时候,不应该使用数组。

数组在创建的时候,会被分配一个固定长度的内存。一旦被分配就不能进行改变。唯一能改变的方法就是转换泛型。所以在元素数量可变的情况下,应使用泛型操作。

多数情况下使用foreach进行循环遍历

因为遍历模式可能多种,比如说根据索引、根据键值。如果它的遍历没有一个公共的接口,那么客户端相当于对具体类型进行了编码。这样就违反了开闭原则。所以多数情况下应考虑实现迭代器模式。

foreach不支持循环时对集合进行增删操作。当遇见需要对循环集合进行增删操作的时候,应使用for循环。

应使用更有效的对象和集合的初始化器。

使用泛型集合代替非泛型集合。泛型集合效率远高于非泛型集合。

选择正确的集合

如果集合的数目是固定并且不涉及转型,使用数组效率高,否则就使用List泛型。

队列Queue<T> 遵循先入先出的模式。它在集合的末尾添加元素,在起始删除元素。可以用来处理并发命令场景。

栈Stack<T>遵循后入先出的模式。它在集合末尾添加元素,在集合末尾删除元素。

字典Dictionary<TKey,TValue>存储的是键值对。值在基于键的散列码的基础上进行存储。

双向链表LinkedList<T>双向链表每个节点都向前指定Previous节点,向后指定Next节点。

三种有序排列

SortedList<T> 对应 List<T>

SortedDictionary<TKey,TValue> 对应 Dictionary<TKey,TValue>

SortedSet<T> 对应 HashSet<T>

四种集合类,如果集合应用于多线程应用中,可以使用保证线程安全

ConcurrentBag<T> 对应 List<T>

ConcurrentDictionary<TKey,TValue> 对应 Dictionary<TKey,TValue>

ConcurrentQueue<T> 对应 Queue<T>

ConcurrentStack<T> 对应 Stack<T>

结束占位符

时间: 2024-10-09 09:09:22

提高C#质量与性能的相关文章

Findbug在项目中的运用--提高代码质量

 FindBugs是一个静态分析工具,它检查类或者 JAR文件,将字节码与一组缺陷模式进行对比以发现可能的问题.有了静态分析工具,就可以在不实际运行程序的情况对软件进行分析 第一 手动安装 在Eclipse点击菜单中Help-->菜单 第二:输入地址: http://findbugs.cs.umd.edu/eclipse,出现版本列表: 按照一步步提示安装重启即可 =================================================== 2) (Re-)star

通过硬件层提高Android动画的性能

曾有许多人问我为什么在他们开发的应用中,动画的性能表现都很差.对于这类问题,我往往会问他们:你们有尝试过在硬件层解决动画的性能问题么? 我们都知道,在播放动画的过程中View在每一帧动画的显示时重绘自身.但如果你使用 View layer,使得View被渲染一次后就放到一个屏幕外的缓冲区中(即 layer),让View不断被重用,而不是一次又一次的重绘的话,这类动画性能问题就迎刃而解了. 此外,硬件层对图像的处理都会在GPU上进行缓存,使得我们在播放动画的过程中对View的特定操作的执行效率更高

使用Zend OpCache 提高 PHP 5.5+ 性能

使用Zend OpCache 提高 PHP 5.5+ 性能 作者:admin | 时间:February 28, 2015 | 分类:Linux | 评论:1 评论 PHP 5.5 以后内建了 OpCache ,我们启用即可 OpCache 的加速原理是把编译后的 bytecode 存储在内存里面, 避免重复编译 PHP 所造成的资源浪费. 虽然内建了, 但是默认没有启用: 军哥lnmp Ubuntu 14.04 nginx1.6.2 mariadb5.5.41 php5.6.5 修改 php.

提高代码质量:如何编写函数

阅读目录 命名 函数参数 编写函数体 总结 函数是实现程序功能的最基本单位,每一个程序都是由一个个最基本的函数构成的.写好一个函数是提高程序代码质量最关键的一步.本文就函数的编写,从函数命名,代码分布,技巧等方面入手,谈谈如何写好一个可读性高.易维护,易测试的函数. 回到顶部 命名 首先从命名说起,命名是提高可读性的第一步.如何为变量和函数命名一直是开发者心中的痛点之一,对于母语非英语的我们来说,更是难上加难.下面我来说说如何为函数命名的一些想法和感受: 采用统一的命名规则 在谈及如何为函数取一

如何提高代码质量

一.代码质量 软件是交付给用户,并由用户体验的产品:代码则是对软件正确且详细的描述,所以代码质量关系到软件产品的质量.虽然软件质量不等于代码质量,但是代码上的缺陷会严重的影响到软件产品的质量.因此,为提高代码质量的投入是值得的. 二.软件产品质量通常可以从以下六个方面去衡量 功能性,即软件是否满足了客户业务要求: 可用性,即衡量用户使用软件需要付出多大的努力: 可靠性,即软件是否能够一直处在一个稳定的状态上满足可用性: 高效性,即衡量软件正常运行需要耗费多少物理资源: 可维护性,即衡量对已经完成

修改Linux内核参数提高Nginx服务器并发性能

当linux下Nginx达到并发数很高,TCP TIME_WAIT套接字数量经常达到两.三万,这样服务器很容易被拖死.事实上,我们可以简单的通过修改Linux内核参数,可以减少Nginx服务器 的TIME_WAIT套接字数量,进而提高Nginx服务器并发性能.   vi /etc/sysctl.conf   增加以下几行: net.ipv4.tcp_fin_timeout = 30 net.ipv4.tcp_keepalive_time = 1200 net.ipv4.tcp_syncookie

如何提高PHP应用的性能

如何提高PHP应用的性能 1. 如果能将类的方法定义成static,就尽量定义成static,它的速度会提升将近4倍.       2.$row['id']的速度是$row[id]的7倍.       3.echo 比 print快,并且使用echo的多重参数(译注:指用逗号而不是句点)代替字符串连接,比如echo$str1,$str2.       4.在执行for循环之前确定最大循环数,不要每循环一次都计算最大值,最好运用foreach代替.       5.注销那些不用的变量尤其是大数组,

如何提高代码质量(转)

原文:如何提高代码质量 1.软件产品质量 软件产品质量通常可以从以下六个方面去衡量(定义) : l         功能性(Functionality),即软件是否满足了客户业务要求: l         可用性(Usability),即衡量用户使用软件需要付出多大的努力: l         可靠性(Reliability),即软件是否能够一直处在一个稳定的状态上满足可用性: l         高效性(Efficiency),即衡量软件正常运行需要耗费多少物理资源: l         可维

软件的质量与性能

一个软件的质量和性能可以从三个维度来进行考量:1)用户.2)开发人员.3)产品人员. 分别对应软件的三个阶段:1)运行时.2)开发时.3)交付时. 软件开发的目的是为用户交付可用的产品,所以用户的维度的软件的第一维度. 用户的维度: 1 正确性(Correctness) 正确性是软件最基本,最重要的属性.他代表了这个软件能够正确的执行计算并给出用户正确的结果.如果软件不能保证正确性,那么这个软件将没有价值可言.比如,一个总是计算错误的财务软件,显然是没有任何用处的.对小型的,功能单一的软件来说,