知识大全 在.NET程序中正确使用String类型[2]

Posted 指令

篇首语:读书之法,在循序而渐进,熟读而精思。本文由小常识网(cha138.com)小编为大家整理,主要介绍了知识大全 在.NET程序中正确使用String类型[2]相关的知识,希望对你有一定的参考价值。

在.NET程序中正确使用String类型[2]  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!

    再看第( )段代码生成的指令 locals init ([ ] string s )IL_ : nopIL_ : ldstr abcd IL_ : stloc IL_ : ret  可以很清楚地看到 第( )段代码将导致String类的Concat()方法被调用(实现字串加法运算) 对于第( )段代码 由于C#编译器聪明地在编译时直接将两个字串合并为一个字串字面量 所以程序运行时CLR只调用一次ldstr指令就完成了所有工作 其执行速度谁快就不言而喻了!   避免使用加法运算符连接不同类型的数据  请看以下代码 String str = + = + ;Console Writeline(str);  生成的MSIL指令为 maxstack locals init ([ ] string str)IL_ : nopIL_ : ldstr + = IL_ : ldc i xc IL_ b: box [mscorlib]System Int IL_ : call string [mscorlib]System String::Concat(object object)IL_ : stloc IL_ : ldloc IL_ : call void [mscorlib]System Console::WriteLine(string)IL_ c: nopIL_ d: ret  可以清晰地看到 这两句C#代码不仅导致了String类的Concat()方法被调用(IL_ ) 而且还引发了装箱操作(IL_ b)!Concat()方法会导致CLR为新字串分配内存空间 而装箱操作不仅要分配内存 还需要创建一个匿名对象 对象创建之后还必须有一个数据复制的过程 代价不菲!  改为以下代码 String str = + = ;Console Write(str);Console WriteLine( );  生成的MSIL指令为 maxstack locals init ([ ] string str)IL_ : nopIL_ : ldstr + = IL_ : stloc IL_ : ldloc IL_ : call void [mscorlib]System Console::Write(string)IL_ d: nopIL_ e: ldc i xc IL_ : call void [mscorlib]System Console::WriteLine(int )IL_ : nopIL_ : ret

  可以看到 虽然多了一次方法调用(Console Write)方法 但却避免了复杂的装箱操作 也避免了调用String Concat()方法对内存的频繁分配操作 性能更好

   .在循环中使用StringBuilder代替String实现字串连接  在某些场合需要动态地将多个子串连接成一个大字串 比如许多复杂的SQL命令都是通过循环语句生成的 这时 应避免使用String类的加法运算符 举个简单的实例

String str = ;for (int i = ; i <= ; i++)str += i;if(i< )str += + ;  上述代码将生成一个字串 + +…+   有了前面的知识 读者一定知道这将导致进行 次装箱操作 次字串内存分配操作(由String Concat()方法引发) 由于生成的MSIL指令太长 此处不再列出 请读者自行用ildasm exe工具查看上述代码生成的MSIL指令   改为以下代码 程序性能会好很多 //预先分配 K的内存空间StringBuilder sb = new StringBuilder( );for (int i = ; i <= ; i++)sb Append(i);if(i< )sb Append( + );String result = sb ToString();  通过使用ildasm exe工具查看生成的MSIL代码 发现虽然上述代码生成的MSIL指令比前面多了 条 但却避免了耗时的装箱操作 而且内存分配的次数也少了很多 当循环的次数很大时 两段代码的运行性能差异很大 cha138/Article/program/net/201311/15506

相关参考

知识大全 c#(或vb.net)程序改进,可以提高性能

  使用值类型的ToString方法  在连接字符串时经常使用+号直接将数字添加到字符串中这种方法虽然简单也可以得到正确结果但是由于涉及到不同的数据类型数字需要通过装箱操作转化为引用类型才可以添加到字

知识大全 编程中string是不是引用类型

  在msdn上  值类型主要由两类组成  结构  枚举  结构分为以下几类  Numeric(数值)类型  整型  浮点型  decimal  bool  用户定义的结构  也就是string属于引

知识大全 .net程序员应该掌握的常用类库

  系统类  Type类Object类String类Array类Console类Exception类GC类MarshalByRefObject类Math类  DateTime结构Guid结构  ICl

知识大全 Java当中的String数据类型

Java当中的String数据类型  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  java中St

知识大全 oracle中一个简单的函数

  创建一个get_name函数返回值是String类型(注这里的返回类型是可以根据自己的需要来设置)程序如下  createorreplacefunctionget_name(strinvarcha

知识大全 如何存贮connection string

  关于connectionstring应该存放在哪里有许多不同的方法每个都有自己的使用场合根据MSDN和我以前编程的经验总结/摘录了一篇文章希望对大家有所帮助   在程序中要存储conne

知识大全 对string类型和stringBuilder类型的研究

对string类型和stringBuilder类型的研究  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下

知识大全 ASP.NET 2.0中保证应用程序的安全

ASP.NET2.0中保证应用程序的安全  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  成员和角

知识大全 全面解析Java中的String数据类型

全面解析Java中的String数据类型  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 首先Str

知识大全 对非String类型进行校验时的出错处理

对非String类型进行校验时的出错处理  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!关于Spri