Oda*_*wan 3 .net c# il value-type
根据MSDN,如果定义了结构,该结构应该覆盖从对象类继承的所有方法.建议在调用任何继承的方法(如ToString)时避免不必要的装箱.
根据MSDN,为了确定是否以及何时发生装箱,可以在MSIL代码中找到IL指令"框".
我写了下面的测试来看拳击.
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);
}
}
}
Run Code Online (Sandbox Code Playgroud)
但是,尽管在结构定义中未调用ToString,但在下面的MSIL代码中无法看到装箱指令.
.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
Run Code Online (Sandbox Code Playgroud)
怎么解释?
参考文章:http://msdn.microsoft.com/en-us/library/ms973858.aspx#code-snippet-6
这可以通过查看是什么来解释Constrained.
字段通常constrained是为了以callvirt标准方式使用而无需明确地封装.它执行以下操作:
如果thisType是引用类型(而不是值类型),则取消引用ptr并将其作为'this'指针传递给方法的callvirt.
如果thisType是一个值类型而thisType实现了方法,那么ptr将被未修改地传递为调用方法指令的'this'指针,用于通过thisType实现方法.
如果thisType是一个值类型而thisType没有实现方法,则ptr被解除引用,装箱,并作为'this'指针传递给callvirt方法指令.
这意味着什么(如MSDN文章所述):
最后一种情况只有在Object,ValueType或Enum上定义方法并且不被thisType覆盖时才会发生.在这种情况下,装箱会导致原始对象的副本.但是,由于Object,ValueType和Enum的方法都没有修改对象的状态,因此无法检测到此事实.
强调我的.基本上说如果拳击确实发生,则无法通过IL确定.
受约束的MSDN:http://msdn.microsoft.com/en-us/library/system.reflection.emit.opcodes.constrained%28v=vs.110%29.aspx
| 归档时间: |
|
| 查看次数: |
346 次 |
| 最近记录: |