问个关于装箱的性能问题... int a = 0;Object b = a 与 a.ToString()这两句...在性能上有什么差别? 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 正在看.NET 框架设计...貌似a.ToString()性能好一点? 嗯...Object b = a;是装箱...a.ToString() 返回的是一个String的引用... 你看书看一半的?我记得相关书上的例子说的是一个Console.Write(+)的例子,然后如果直接传object会发生3次装箱而先ToString就不会发生这么多装箱,具体例子忘了 object b b是引用aa.ToString() 返回一个STRING的引用...不知道你想比什么? 呃...书确实没有看完...不过那一章是看完了...其实我想问的就是Object b = a 与 a.ToString() 这两句...在性能上有什么差别?装箱什么的,我大概明白了... 我估计楼主是想问a.ToString()这句有没有产生装箱.没有。 呵呵...没有产生装箱...我也是这样认为的...如果有装箱的话性能上有缺陷...不过装箱的原理也是返回一个引用类型...而a.ToString 返回的也是一个引用类型...它们之间性能上有差别吗?书上有这样一个例子Console.WriteLine(值类型, + "," + 引用类型);它说进一步的优化方法是这样:Console.WriteLine(值类型.ToString() + "," + 引用类型);按照书上说的,性能仿佛是值类型.ToString() > 装箱操作...可是原理却仿佛又一样~ 你看的什么书?赶紧丢掉去...纯属胡说八道...Console.WriteLine(值类型 + "," + 引用类型);Console.WriteLine(值类型.ToString() + "," + 引用类型);Console.WriteLine(值类型.ToString() + "," + 引用类型.ToString());完全一样没有任何区别...Console.WriteLine(值类型 + "," + string);Console.WriteLine(值类型.ToString() + "," + string);完全一样没有任何区别...首先string类型是一种特殊的引用类型...其次在这种情况下+运算符会自动调用值类型或引用类型对象的ToString方法,并不存在装拆箱操作... 我看你才是纯属胡说八道!未装箱的值类型虽然没有类型对象指针,但却可以调用类型继承或是重载的虚方法,因为CLR正好可以call指令去调用这些虚方法(不是callvirt)Console.WriteLine(值类型 + "," + 引用类型); >>>值类型类型必须boxing.Console.WriteLine(值类型.ToString() + "," + 引用类型); >>>不会发生任何boxing. int i = 10; object o=new object(); //(1) Console.WriteLine(i.ToString() + "," + o); //(2) Console.WriteLine(i + "," + o); //(1)的IL代码 IL_000c: call instance string [mscorlib]System.Int32::ToString() IL_0011: ldstr "," IL_0016: ldloc.1 IL_0017: call string [mscorlib]System.String::Concat(object, object, object) IL_001c: call void [mscorlib]System.Console::WriteLine(string) //(2)的IL代码 IL_0023: box [mscorlib]System.Int32 IL_0028: ldstr "," IL_002d: ldloc.1 IL_002e: call string [mscorlib]System.String::Concat(object, object, object) IL_0033: call void [mscorlib]System.Console::WriteLine(string)啥也不说了,自己看IL代码吧。 呵呵...Jeffrey Richter的作品啊...以前我也是这样认为的,所以不知不觉引入了很多装箱的操作,浪费了一些不必要的性能。现在似乎明白一些了...谢谢大家... 泛型方法返回值问题 如何提高查询数据的速度? 欢迎大家试用我的Web浏览器,并提出改进要求 网页出现“无法继续,此应用程序格式不正确” 打开form设计视图时的错误,请高手指点! C# 中怎样用一个字符串实例化一个类 如何进行用户编号查询的优化? 关于DataGrid如何手动绑定数据库的?!急!! 16进制的数字和10进制的数字怎么转换? C#Winform--datagridview数据绑定问题 关于一个跨线程访问控件的奇怪问题,在线,有结果马上结贴 请问这句vb.net什么意思?在c#.net里怎么写?
貌似a.ToString()性能好一点?
Object b = a;是装箱...
a.ToString() 返回的是一个String的引用...
我记得相关书上的例子说的是一个
Console.Write(+)的例子,然后
如果直接传object会发生3次装箱
而先ToString就不会发生这么多装箱,具体例子忘了
不过那一章是看完了...
其实我想问的就是
Object b = a 与 a.ToString()
这两句...在性能上有什么差别?装箱什么的,我大概明白了...
a.ToString()
这句有没有产生装箱.没有。
没有产生装箱...我也是这样认为的...
如果有装箱的话性能上有缺陷...
不过装箱的原理也是返回一个引用类型...
而a.ToString 返回的也是一个引用类型...
它们之间性能上有差别吗?
书上有这样一个例子Console.WriteLine(值类型, + "," + 引用类型);
它说进一步的优化方法是这样:Console.WriteLine(值类型.ToString() + "," + 引用类型);
按照书上说的,性能仿佛是值类型.ToString() > 装箱操作...
可是原理却仿佛又一样~
Console.WriteLine(值类型.ToString() + "," + 引用类型);
Console.WriteLine(值类型.ToString() + "," + 引用类型.ToString());
完全一样没有任何区别...Console.WriteLine(值类型 + "," + string);
Console.WriteLine(值类型.ToString() + "," + string);
完全一样没有任何区别...首先string类型是一种特殊的引用类型...其次在这种情况下+运算符会自动调用值类型或引用类型对象的ToString方法,并不存在装拆箱操作...
(不是callvirt)Console.WriteLine(值类型 + "," + 引用类型);
>>>
值类型类型必须boxing.Console.WriteLine(值类型.ToString() + "," + 引用类型);
>>>
不会发生任何boxing.
int i = 10;
object o=new object(); //(1)
Console.WriteLine(i.ToString() + "," + o);
//(2)
Console.WriteLine(i + "," + o); //(1)的IL代码
IL_000c: call instance string [mscorlib]System.Int32::ToString()
IL_0011: ldstr ","
IL_0016: ldloc.1
IL_0017: call string [mscorlib]System.String::Concat(object,
object,
object)
IL_001c: call void [mscorlib]System.Console::WriteLine(string) //(2)的IL代码
IL_0023: box [mscorlib]System.Int32
IL_0028: ldstr ","
IL_002d: ldloc.1
IL_002e: call string [mscorlib]System.String::Concat(object,
object,
object)
IL_0033: call void [mscorlib]System.Console::WriteLine(string)啥也不说了,自己看IL代码吧。
以前我也是这样认为的,所以不知不觉引入了很多装箱的操作,浪费了一些不必要的性能。
现在似乎明白一些了...
谢谢大家...