[高分求助]s1=string.Concat(s1,s2) 与 s1+=s2 的区别

小范f-li.cn 2010-02-03 12:06:32
我google了下 有不少贴说 string.Concat效率高用这个...
Console.Write("a" + "b" + "c");
Console.Write(String.Concat("a", "b", "c"));

然后用reflector看了下,竟然是...
Console.Write("abc");
Console.Write("a" + "b" + "c");


谁解释下 谢谢!~
...全文
698 24 打赏 收藏 转发到动态 举报
写回复
用AI写文章
24 条回复
切换为时间正序
请发表友善的回复…
发表回复
vrhero 2010-02-03
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 wzp144650 的回复:]
用reflecter看的mscorlib程序集的String.Concat方法

public static string Concat(string str0, string str1)
{
    return (str0 + str1);
}[/Quote]
不要用reflector看,这种差异要用IL Disassembler看...

用reflector相当于先把红楼梦翻译成英文再按英文翻译回中文,有些地方已经狗屁不通了...

很明确地一点是...+运算符在连接字符串时就是调用String.Concat方法,IL完全相同...所以这里只有编译时的差异,在运行时两者完全相同,不可能有任何效率上的分别...
十八道胡同 2010-02-03
  • 打赏
  • 举报
回复
这个是stringbuilder的append
public StringBuilder Append(string value)
{
if (value != null)
{
string stringValue = this.m_StringValue;
IntPtr currentThread = Thread.InternalGetCurrentThread();
if (this.m_currentThread != currentThread)
{
stringValue = string.GetStringForStringBuilder(stringValue, stringValue.Capacity);
}
int length = stringValue.Length;
int requiredLength = length + value.Length;
if (this.NeedsAllocation(stringValue, requiredLength))
{
string newString = this.GetNewString(stringValue, requiredLength);
newString.AppendInPlace(value, length);
this.ReplaceString(currentThread, newString);
}
else
{
stringValue.AppendInPlace(value, length);
this.ReplaceString(currentThread, stringValue);
}
}
return this;
}




十八道胡同 2010-02-03
  • 打赏
  • 举报
回复
像这种字符串拼接 还是用stringbuilder
public static string Concat(string str0, string str1)
{
if (IsNullOrEmpty(str0))
{
if (IsNullOrEmpty(str1))
{
return Empty;
}
return str1;
}
if (IsNullOrEmpty(str1))
{
return str0;
}
int length = str0.Length;
string dest = FastAllocateString(length + str1.Length);
FillStringChecked(dest, 0, str0);
FillStringChecked(dest, length, str1);
return dest;
}






private static unsafe void FillStringChecked(string dest, int destPos, string src)
{
int length = src.Length;
if (length > (dest.Length - destPos))
{
throw new IndexOutOfRangeException();
}
fixed (char* chRef = &dest.m_firstChar)
{
fixed (char* chRef2 = &src.m_firstChar)
{
wstrcpy(chRef + destPos, chRef2, length);
}
}
}





private static unsafe void wstrcpy(char* dmem, char* smem, int charCount)
{
if (charCount > 0)
{
if ((((int) dmem) & 2) != 0)
{
dmem[0] = smem[0];
dmem++;
smem++;
charCount--;
}
while (charCount >= 8)
{
*((int*) dmem) = *((uint*) smem);
*((int*) (dmem + 2)) = *((uint*) (smem + 2));
*((int*) (dmem + 4)) = *((uint*) (smem + 4));
*((int*) (dmem + 6)) = *((uint*) (smem + 6));
dmem += 8;
smem += 8;
charCount -= 8;
}
if ((charCount & 4) != 0)
{
*((int*) dmem) = *((uint*) smem);
*((int*) (dmem + 2)) = *((uint*) (smem + 2));
dmem += 4;
smem += 4;
}
if ((charCount & 2) != 0)
{
*((int*) dmem) = *((uint*) smem);
dmem += 2;
smem += 2;
}
if ((charCount & 1) != 0)
{
dmem[0] = smem[0];
}
}
}




tianliang1 2010-02-03
  • 打赏
  • 举报
回复
其实这些小数据的连接,你根本都看不出差距了
若有大量的数据需要连接,就用StingBulider来控制,就Ok了
wuyq11 2010-02-03
  • 打赏
  • 举报
回复
StringBuilder最好
String.Concat()
+ 操作
String.Format()
字符串连接性能
laowang134 2010-02-03
  • 打赏
  • 举报
回复
同意2楼!~
stringbulider比较好吧。。
wzp144650 2010-02-03
  • 打赏
  • 举报
回复
用reflecter看的mscorlib程序集的String.Concat方法

public static string Concat(string str0, string str1)
{
return (str0 + str1);
}

小范f-li.cn 2010-02-03
  • 打赏
  • 举报
回复
zhoukang0916 你的意思是 string.Concat 好?
小范f-li.cn 2010-02-03
  • 打赏
  • 举报
回复
我想用 string.Format 但貌似听说效率不好??
PandaIT 2010-02-03
  • 打赏
  • 举报
回复

//建议楼主多去查阅MSDN
//reflector
int i;
string s = "";
for (i = 0; i < 100; i++)
{
s = s + i.ToString();//此处的ToString()是多余的
}
Console.Write(s);
s = "";
for (i = 0; i < 100; i++)
{
s = s + i.ToString();//同上
}
Console.Write(s);
PandaIT 2010-02-03
  • 打赏
  • 举报
回复
s1+=s2==s1=s1+s2
小范f-li.cn 2010-02-03
  • 打赏
  • 举报
回复

string s = "";
for (int i = 0; i < 100; i++)
{
s += i.ToString();
}
Console.Write(s);

s = "";
for (int i = 0; i < 100; i++)
{
s = String.Concat(s, i.ToString());
}
Console.Write(s);
//reflector
int i;
string s = "";
for (i = 0; i < 100; i++)
{
s = s + i.ToString();
}
Console.Write(s);
s = "";
for (i = 0; i < 100; i++)
{
s = s + i.ToString();
}
Console.Write(s);

PandaIT 2010-02-03
  • 打赏
  • 举报
回复
如果只是字符串进行拼加

建议用StringBuilder str = new StringBuilder();
str.Append();
PandaIT 2010-02-03
  • 打赏
  • 举报
回复
Console.Write("a" + "b" + "c");
Console.Write(String.Concat("a", "b", "c"));//如果参数不是字符串!会先将其转换成字符串再执行操作

//你那样看其实看不到什么
24K純帥 2010-02-03
  • 打赏
  • 举报
回复
这么多高手都解释了,StringBuilder最好
wendy_fw 2010-02-03
  • 打赏
  • 举报
回复
好貼, 一定要頂一下
josephSC 2010-02-03
  • 打赏
  • 举报
回复
差别有那么明显吗??
  • 打赏
  • 举报
回复
换了个输入法,经常打出错的词组,郁闷
[Quote=引用 20 楼 yangglemu 的回复:]
字符串相加会直接产生一个新的字符串,这是.net会了提高字符串处理速度而设计的,缺点是额外占用内存(因为原有的两个字符串没有消失,等着GC回收)
Concat类似于C/C++里的对Char[]数据的原始操作,效率肯定比不上直接来一个新的字符串高
[/Quote]


+是速度最快的,但短时间内占用内存是最大的,它就象C/C++里的strCopy方法
Concat或者StringBuilder是最节省内存的,但是处理速度是最慢的,它就象是直接操作一个char*

以上观点来源于我以前学习C/C++时的认识,不同意见者,欢迎交流
  • 打赏
  • 举报
回复
字符串相加会直接产生一个新的字符串,这是.net会了提高字符串处理速度而设计的,据点是额外占用内存(因为原有的两个字符串没有消息,等着GC回收)
Concat类似于C/C++里的对Char[]数据的原始操作,效率肯定比不上直接来一个新的字符串高
nashina 2010-02-03
  • 打赏
  • 举报
回复
以前都是想用哪种方式就用哪种,还真没有关心过他们之间的区别以及效率问题
加载更多回复(4)

111,120

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • AIGC Browser
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧