@ ggf31316
“我相信如果结构不覆盖方法,调用 ToString、Equals 和 Gethashcode 会导致装箱。”
我已经为你检查了 ToString。Int32 确实覆盖了 ToString,所以我创建了一个没有覆盖的结构。我使用.NET Reflector来确保该结构不会以某种方式神奇地覆盖 ToString(),但事实并非如此。
所以代码是这样的:
using System;
namespace ConsoleApplication29
{
class Program
{
static void Main(string[] args)
{
MyStruct ms = new MyStruct(5);
string s = ms.ToString();
Console.WriteLine(s);
}
}
struct MyStruct
{
private int m_SomeInt;
public MyStruct(int someInt)
{
m_SomeInt = someInt;
}
public int SomeInt
{
get
{
return m_SomeInt;
}
}
}
}
Main 方法的 MSIL(通过ILDASM)是这样的:
IL_0000: ldloca.s ms
IL_0002: ldc.i4.5
IL_0003: call instance void ConsoleApplication29.MyStruct::.ctor(int32)
IL_0008: ldloca.s ms
IL_000a: constrained. ConsoleApplication29.MyStruct
IL_0010: callvirt instance string [mscorlib]System.Object::ToString()
IL_0015: stloc.1
IL_0016: ldloc.1
IL_0017: call void [mscorlib]System.Console::WriteLine(string)
IL_001c: ret
现在,尽管没有发生拳击呼叫,但如果您查看有关 constrained + a call virt 的文档,您会发现它声明确实发生了拳击。哦哦
引用:
如果 thisType 是一个值类型并且 thisType 没有实现方法,则 ptr 被取消引用,装箱,并作为“this”指针传递给 callvirt 方法指令。