在C#中,在值类型上调用对象函数(如Equals()和ToString())意味着编译器将执行自动装箱以执行操作。例如。自动装箱是否会出现在以下代码中?
int x=2;
int y=7;
bool isEqual = x.Equals(y);
答案 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更好的函数成员:
- 对于每个参数,从AX到PX的隐式转换并不比从AX到QX的隐式转换更差,并且
- 对于至少一个参数,从AX到PX的转换优于从AX到QX的转换。
醇>执行此评估时,如果MP或MQ适用于其扩展形式,则PX或QX引用参数列表的展开形式的参数。
答案 2 :(得分:0)
不是在这种情况下,因为int实现IEquatable<int>
并且IEquatable<int>
是在这里调用的等于,而不是对象
但通常,是的。