http://blog.csdn.net/amandag/archive/2009/06/08/4252723.aspx
从这里看到的,下面第一个是我写的,for里用到了string,但柯南的blog里说:(我不懂,什么区别..)
最后,这道题目考察的其实就是很多人容易犯的错误,也是C#面试中的一个常见考点:String类与StringBuilder类的区别。所以只要代码中出现在循环中string类的对象叠加的代码,基本over。我的代码:        static void Main(string[] args)
        {
            Console.WriteLine("请您输入一个字符串");
            string str = Console.ReadLine();
            string strReturn=Reverse(str);
            Console.Write(strReturn);
            Console.ReadLine();
        }
        public static string Reverse(string str)
        { 
            string strReturn="";
            for(int i=str.Length-1; i>=0; i--)
            {
                strReturn += str.Substring(i, 1);
            }
            return strReturn;
        }
柯南的标准答案:
public static string Reverse(string str) 

    if (string.IsNullOrEmpty(str)) 
    { 
        throw new ArgumentException("参数不合法"); 
    }     StringBuilder sb = new StringBuilder(str.Length); 
    for (int index = str.Length - 1; index >= 0; index--) 
    { 
        sb.Append(str[index]); 
    } 
    return sb.ToString(); 
}

解决方案 »

  1.   

    string你操作一次实际上就new了一个,少了没事,多了就撑死
      

  2.   

    请问2楼的大哥   为什么是 操作一次实际上就new了一个?我这就声名了一个变量啊:  string strReturn="";
      

  3.   

    strReturn="";
    第一次循环:strReturn=""+"A";系统创造一个新的字符串"A:赋给变量strReturn;
    第二次循环,strReturn="A"+"B";系统创造一个新的字符串"AB"赋值给变量strReturn
    字符串"A"虽然用不着了,但因为是在循环中,垃圾回收器的优先级又低,所以来不及回收,仍占用着内存
    如果循环N次,内存中就有N个字符串的不同版本占用站内存
    如此性能和内存带来的缺点就大了而StringBuilder就是为解决这个问题量身打造的,在它里面对字符串进行操作,不会在内存中创建新的字符串占用内存,一切都在内部解决,具体可以看下MSDN关于StringBuilder的说明
      

  4.   

    还有一点也要提一下:
     .net 处理字符串加减操作的方式,是出于性能的考虑,在系统中,字符串实际上是以Char[]的形式保存的,最后以'\0'结束,如字符串x="aaa",在内存中是这样存放的char[]{'a','a','a','\0'}如果要实现两个串相加的操作"aaa" + "bbb"的操作,就需要扩大 char[]数组的长充,插进 "bbb"p字符串成如下形式:
    char[]{'a','a','a','b','b','b','\0},如此操作的速度上肯定不如直接新建一个char[], 然后把两个字符串放进去,因为没有插入的位置计算,移位等过程了,所以系统对字符串的处理采用了后者的形式,牺牲一点内存,换来性能.
    但是大量字符串进行操作的话,对内存的开销就太大了,所以又用了原来的方式,就是StringBuilder
      

  5.   

    C# 的String类的实例是不可变的,即无法修改它们
      

  6.   

    string的内容是只读的,不允许修改
      

  7.   

    那不考虑占用内存大小的话用StringBuilder和string那个速度快点?
    还有string临时创建的内容会不会在结束自动回收?需要用using(){}?
      

  8.   

    如果操作string比较频繁就用stringbuilder