代码如下:
object[] sendData = new object[1024 * 1024];
string sendDatastr = "";
string c = "";
for (int i = 0; i <1024*1024; i++)
{
sendDatastr += (sendData[i] as string);();//sendData[i]中包含1M个uint类型数据
// c = (string)(sendData[i]);//注意:若是加入这句,就会显示强制转换uint到string失败
//sendDatastr+= sendData[i].Convert.ToString();//这个是正确,但由于效率低的不能接受
}
return sendDatastr;
问题:运行结果是sendDatastr=“ ”,也就是说 (sendData[i] as string)是失败的,为什么呢?求解释啊~
用.ToString方法,同时用StringBuilder.Append代替string的相加操作。
那个也太慢了哈,要循环1024*1024次的。“同时用StringBuilder.Append代替string的相加操作。”可以提高效率的吗?
@博客园的初学者: 个人感觉效率是一样的,两者皆同。
@张晓鹏: 真的是太感谢了,StringBuilder.Append这个真的是太好用了,效率提高不知道有多少倍,不管是用Convert.ToString()还是用.ToString() ,都很快。效率问题已经完全解决了,谢谢哈~
既然这么看重效率,为什么uint类型数据用object数组(引起额外的装箱操作)?
既然这么看重效率,为什么要把uint类型数据再全部转换为string?
因为要用as string就应该是 string temp=(object obj[i] as string),所以才把数组定义成object[],而其中存其实是uint的数据。但是如果这样用(uint obj[i]as string)本身是错的啊。
看MSDN:
expression as type //等效于 expression is type ? (type)expression : (type)null 2 is string ? (string)2:null;//2 is string肯定是false嘛。所以转换不成功嘛。
他在转换的时候做了类型判断。。
我明白你的意思了,但我还不明白若判断"a” as string? (string)"a":null;//结果是true,但这个显然不用再转换的啊。
那我是不是可以说,若是string类型的则是true;若不是string则是false。那结论是 as string 分明是不能用来进行将其他类型的数据转换成string类型的吧??这个结论是对的吗?
@博客园的初学者:
不是不能用来转换,而是只能用在同种类型之间的转换,同种类型包括继承关系的两种类型。
比如:
object a = "a"; //此处a是用object 声明的,但是他实际它是string类型的。 string b = a;// 虽然它是string类型的,但是你这样直接赋值肯定不行嘛。 string c = a as string;//所以你需要转换,这样才对的。
object[] sendData = new object[1024 * 1024]; StringBuilder sb = new StringBuilder(); string c = ""; for (int i = 0; i < 1024 * 1024; i++) { sb.Append(sendData[i].ToString()); } return sendDatastr;
StringBuilder效率比字符串相加高
还有,dudu说的精辟
是滴~您说的很对,我也刚试过了,哈哈~谢谢
@博客园的初学者: StringBuilder也要分情况使用。一般来说循环小于500次的时候,字符串直接相加反而是快的。你可以google关键字“Performance considerations for strings in C#”
顺便说一句,问题解决了的话就把帖结了吧
需要设置一下StringBuilder的初始容量(大于或等于实际写入的字符数),这样效率会更高