int a = 0;Object b = a 与 a.ToString()
这两句...在性能上有什么差别?

解决方案 »

  1.   

    正在看.NET 框架设计...
    貌似a.ToString()性能好一点?
      

  2.   

    嗯...
    Object b = a;是装箱...
    a.ToString() 返回的是一个String的引用...
      

  3.   

    你看书看一半的?
    我记得相关书上的例子说的是一个
    Console.Write(+)的例子,然后
    如果直接传object会发生3次装箱
    而先ToString就不会发生这么多装箱,具体例子忘了
      

  4.   

    object b  b是引用aa.ToString() 返回一个STRING的引用...不知道你想比什么?
      

  5.   

    呃...书确实没有看完...
    不过那一章是看完了...
    其实我想问的就是
    Object b = a 与 a.ToString() 
    这两句...在性能上有什么差别?装箱什么的,我大概明白了...
      

  6.   

    我估计楼主是想问
    a.ToString()
    这句有没有产生装箱.没有。
      

  7.   

    呵呵...
    没有产生装箱...我也是这样认为的...
    如果有装箱的话性能上有缺陷...
    不过装箱的原理也是返回一个引用类型...
    而a.ToString 返回的也是一个引用类型...
    它们之间性能上有差别吗?
    书上有这样一个例子Console.WriteLine(值类型, + "," + 引用类型);
    它说进一步的优化方法是这样:Console.WriteLine(值类型.ToString() + "," + 引用类型);
    按照书上说的,性能仿佛是值类型.ToString() > 装箱操作...
    可是原理却仿佛又一样~
      

  8.   

    你看的什么书?赶紧丢掉去...纯属胡说八道...Console.WriteLine(值类型 + "," + 引用类型);
    Console.WriteLine(值类型.ToString() + "," + 引用类型);
    Console.WriteLine(值类型.ToString() + "," + 引用类型.ToString());
    完全一样没有任何区别...Console.WriteLine(值类型 + "," + string);
    Console.WriteLine(值类型.ToString() + "," + string);
    完全一样没有任何区别...首先string类型是一种特殊的引用类型...其次在这种情况下+运算符会自动调用值类型或引用类型对象的ToString方法,并不存在装拆箱操作...
      

  9.   

    我看你才是纯属胡说八道!未装箱的值类型虽然没有类型对象指针,但却可以调用类型继承或是重载的虚方法,因为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代码吧。
      

  10.   

    呵呵...Jeffrey Richter的作品啊...
    以前我也是这样认为的,所以不知不觉引入了很多装箱的操作,浪费了一些不必要的性能。
    现在似乎明白一些了...
    谢谢大家...