在值类型上调用对象函数是否会导致自动装箱

时间:2014-07-06 17:48:22

标签: c# autoboxing

在C#中,在值类型上调用对象函数(如Equals()和ToString())意味着编译器将执行自动装箱以执行操作。例如。自动装箱是否会出现在以下代码中?

int x=2;
int y=7;
bool isEqual = x.Equals(y);

3 个答案:

答案 0 :(得分:2)

没有

    static void DoIt()
    {
        int x = 2;
        int y = 7;
        bool isEqual = x.Equals(y);
        Console.WriteLine(isEqual);
    }

将成为:

  IL_0002:  stloc.0
  IL_0003:  ldc.i4.7
  IL_0004:  stloc.1
  IL_0005:  ldloca.s   x
  IL_0007:  ldloc.1
  IL_0008:  call       instance bool [mscorlib]System.Int32::Equals(int32)
  IL_000d:  stloc.2
  IL_000e:  ldloc.2
  IL_000f:  call       void [mscorlib]System.Console::WriteLine(bool)

目前没有box个IL操作码,因此不会发生装箱。

正如您所看到的,它调用Int32.Equals(Int32)方法不需要任何装箱 - 它接受非盒装Int32结构作为参数。还有Int32.Equals(Object) - 这个需要拳击。

答案 1 :(得分:1)

如果类型实现IEquatable<T>,那么将选择更好的重载分辨率,并且更好的意思是更具体。在这种情况下,int会覆盖Equals,因此不会发生装箱。如果界面未实现,则会使用object.Equals

来自C#规范:

  

7.4.2.2更好的职能成员

     

给定一个参数列表A,其中包含一组参数类型{A1,A2,...,AN}和两个适用的函数成员MP和MQ,参数类型为{P1,P2,...,PN}和{Q1 ,Q2,...,QN},如果符合以下条件,MP被定义为比MQ更好的函数成员:

     
      
  1. 对于每个参数,从AX到PX的隐式转换并不比从AX到QX的隐式转换更差,并且
  2.   
  3. 对于至少一个参数,从AX到PX的转换优于从AX到QX的转换。
  4.         

    执行此评估时,如果MP或MQ适用于其扩展形式,则PX或QX引用参数列表的展开形式的参数。

答案 2 :(得分:0)

不是在这种情况下,因为int实现IEquatable<int>并且IEquatable<int>是在这里调用的等于,而不是对象

但通常,是的。