zoukankan      html  css  js  c++  java
  • .net 如何高效地使用string(转)

    string是恒定的(immutable)

    和其他类型比较,string最为显著的一个特点就是它具有恒定不变性:我们一旦创建了一个string,在managed heap 上为他分配了一块连续的内存空间,我们将不能以任何方式对这个string进行修改使之变长、变短、改变格式。所有对这个string进行各项操作(比如调用ToUpper获得大写格式的string)而返回的string,实际上另一个重新创建的string,其本身并不会产生任何变化。

    String的恒定性具有很多的好处,它首先保证了对于一个既定string的任意操作不会造成对其的改变,同时还意味着我们不用考虑操作string时候出现的线程同步的问题。在string恒定的这些好处之中,我觉得最大的好处是:它成就了字符串的驻留。

    CLR通过一个内部的interning table保证了CLR只维护具有不同字符序列的string,任何具有相同字符序列的string所引用的均为同一个string对象,同一段为该string配分的内存快。字符串的驻留极大地较低了程序执行对内存的占用。

    对于string的恒定性和字符串的驻留,还有一点需要特别指出的是:string的恒定性不单单是针对某一个单独的AppDomain,而是针对一个进程的。

    下面简单介绍一些高效地使用string的一些小的建议:

    1. 尽量使用字符串(literal string)相加来代替字符串变量和字符创相加,因为这样可以使用现有的string操作指令进行操作和利用字符串驻留。

    比如:

    string s = "abc" + "def";

    优于

    string s = "abc";
    = s + "def";

    2. 在需要的时候使用StringBuilder对string作频繁的操作:

    由于string的恒定性,在我们对一个string进行某些操作的时候,比如调用ToUpper()或者ToLower()把某个string每个字符转化成大写或者小写;调用SubString()取子串;会创建一个新的string,有时候会创建一些新的临时string。这样的操作会增加内存的压力。所有在对string作频繁操作的情况下,我们会考虑使用StringBuilder来高效地操作string。StringBuilder之所以能对string操作带来更好的performance,是因为在它的内部维护一个字符数组,而不是一个string来避免string操作带来的新的string的创建。

    StringBuilder是一个很好的字符累加器,我们应该充分地利用这一个功能:

    StringBuilder sb = new StringBuilder();
    sb.Append(str1 
    + str2);

    最好写成

    StringBuilder sb = new StringBuilder();
    sb.Append(str1);
    sb.Append(str2);

    避免创建一个新的临时string来保存str1 + str2。

    再比如下面的Code

    StringBuilder sb = new StringBuilder();
    sb.Append(WorkOnString1());
    sb.Append(WorkOnString2());
    sb.Append(WorkOnString3());

    最好写好吧WorkOnString1,WorkOnString2,WorkOnString3定义成:

    WorkOnString1(StringBuilder sb)
    WorkOnString2(StringBuilder sb)
    WorkOnString3(StringBuilder sb)

    3. 高效地进行string的比较操作

    我们知道,对象之间的比较有比较Value和比较Reference之说。一般地对Reference进行比较的速度最快。对于string,在字符串驻留的前提下,我们可以把对Value的比较用Reference的比较来代替从而会的Performance的提升。

    此外,对于忽略大小写的比较,我们最好使用string的static方法Compare(string strA, string strB, bool ignoreCase)。也就是说:

    if(str1.ToLower()==str2.ToLower())

    最好写成

    If(string. Compare(str1,str2,true))

    http://www.cnblogs.com/flysun0311/archive/2010/05/13/1734703.html

  • 相关阅读:
    android学习(2) 多线程的理解
    activity学习(1) 生命周期理解
    webkit.net使用方法日记
    微信小程序入门一
    ES入门笔一
    node八-核心模块、包
    require、缓存
    node七-required、缓存
    Node六-模块化
    Node笔记五-进程、线程
  • 原文地址:https://www.cnblogs.com/jiwenchao/p/2009719.html
Copyright © 2011-2022 走看看