编写C#高质量代码

一. 正确操作字符串

字符串是引用类型
·
1.确保尽量少的装箱操作,多使用ToString方法

 string str1 = "str1" + 9;
 string str1 = "str1" + 9.ToString;

第一行代码生成的IL代码如图


第二行代码生成的IL代码如图

可以看出,第一行代码运行时会完成一次装箱行为(IL代码中的box),第二行代码没有装箱
·
2. 避免分配额外的内存空间
string对象一旦赋值就不可改变。运行时调用System.String类中的任何方法或进行任何运行(=+),都会在内存中创建一个新的字符串对象,分配新的内存空间。下面就是错误的示例

private static void NewMethod1()
{
        string s1 = "abc";
        s1 = "123" + s1 + "456";  //创建了三个字符串对象,并执行了一次 string.Contact方法
}

private static void NewMethod2()
{
        string re6 = 9 + "456";  //发送一次装箱,并执行了一次 string.Contact方法
}

·
3.使用StringBuilder代替string产生的性能损耗

private static void NewMethod3()
{
        StringBuilder builder = new StringBuilder("t");
        builder.Append("e");
        string result = builder.ToString();
}

还有一个方法可以简化这种操作,即使用string.Format方法,这个方法内部使用了StringBuilder进行字符串格式化

private static void NewMethod3()
{
        string a = "t";
        string b = "e";
        string.Format("{0}{1}",a,b);
}

·

二. 使用默认转型方法

类型转换 ,是我们经常会用到的
·
1.使用类型的转换运算符
转换运算符:隐式转换和显示转换(强制转换),基元类型❶大多数都有转换运算符

int i = 0 ;
float j = 0;
j = i;  //int到float类型存在一个隐式转换
i = (int)j; //float到int存在,而且必须存在一个显示转换

2.使用类型内置的Parse、TryParse、ToString等方法
在FCL❷中,如果某个类型经常需要进行转型操作,类型自身则会带有 一些转型方法 。比如从string转型为int,因为其经常发生,所以int本身就提供了Parse和TryParse方法

3.使用帮助类提供的方法
可以使用如 System.Convert类、System.BitConverter类来进行类型的转换

4.使用CLR支持的转型

额外知识补充

1、装箱为什么会带来性能损耗

  • 首先,会为值类型在托管堆中分配内存。除了值类型本身所分配的内存外,内存总量还要加上类型对象指针和同步块索引所占用的内存
  • 将值类型的值复制到新分配的堆内存中
  • 返回已经成为引用类型的对象的地址

参考文献

《编写高质量代码改善c#程序的157建议》

❶ 基元类型:sbyte / byte / short / ushort /int / uint / long / ulong / char / float / double / bool
❷ FCL : (Framework Class Library)即Framework类库。

你可能感兴趣的:(编写C#高质量代码)