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();
}
从这里看到的,下面第一个是我写的,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();
}
第一次循环:strReturn=""+"A";系统创造一个新的字符串"A:赋给变量strReturn;
第二次循环,strReturn="A"+"B";系统创造一个新的字符串"AB"赋值给变量strReturn
字符串"A"虽然用不着了,但因为是在循环中,垃圾回收器的优先级又低,所以来不及回收,仍占用着内存
如果循环N次,内存中就有N个字符串的不同版本占用站内存
如此性能和内存带来的缺点就大了而StringBuilder就是为解决这个问题量身打造的,在它里面对字符串进行操作,不会在内存中创建新的字符串占用内存,一切都在内部解决,具体可以看下MSDN关于StringBuilder的说明
.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
还有string临时创建的内容会不会在结束自动回收?需要用using(){}?