一. 正确操作字符串
字符串是引用类型
·
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类库。