Согласно MSDN, если была определена структура, эта структура должна переопределять все методы, унаследованные от класса объекта. Рекомендуется избегать ненужного бокса при вызове любого унаследованного метода, такого как ToString.Бокс пользовательских типов значений
В соответствии с MSDN, чтобы определить, происходит ли и когда происходит бокс, поле «инструкция» IL-кода можно найти в коде MSIL.
Я написал следующий тест, чтобы увидеть бокс.
using System;
namespace TestingBoxing
{
public struct StructX
{
public int member1;
public int member2;
}
public class Program
{
public static void Main(string[] args)
{
StructX s1;
s1.member1 = 2;
s1.member2 = 5;
string str = s1.ToString();
Console.WriteLine(str);
}
}
}
Однако команда бокс нельзя увидеть в коде MSIL ниже, хот ToString вызывается без переопределения в определении структуры.
.method public hidebysig static void Main(string[] args) cil managed
{
.entrypoint
// Code size 37 (0x25)
.maxstack 2
.locals init ([0] valuetype TestingBoxing.StructX s1,
[1] string str)
IL_0000: ldloca.s s1
IL_0002: ldc.i4.2
IL_0003: stfld int32 TestingBoxing.StructX::member1
IL_0008: ldloca.s s1
IL_000a: ldc.i4.5
IL_000b: stfld int32 TestingBoxing.StructX::member2
IL_0010: ldloca.s s1
IL_0012: constrained. TestingBoxing.StructX
IL_0018: callvirt instance string [mscorlib]System.Object::ToString()
IL_001d: stloc.1
IL_001e: ldloc.1
IL_001f: call void [mscorlib]System.Console::WriteLine(string)
IL_0024: ret
} // end of method Program::Main
Как это можно объяснить?
Ссылка статьи: http://msdn.microsoft.com/en-us/library/ms973858.aspx#code-snippet-6
Возможно, это подразумевается в 'constrained' вызова. См. Здесь: http://msdn.microsoft.com/en-us/library/system.reflection.emit.opcodes.constrained%28v=vs.110%29.aspx –
.constrained, похоже, не имеет никакого эффекта в этом контексте, Я попытался переопределить метод ToString, но был создан .constrained. –
сдержанный всегда будет сгенерирован, если я правильно пойму, только то, что он сделает, изменится –