我是一个绝对的初学者,你看。假设我在堆栈上有一个字符串对象,并且想要获取其中的字符数 - 它的 .Length 属性。我将如何获得隐藏在里面的 int32 数字?
提前谢谢了!
我是一个绝对的初学者,你看。假设我在堆栈上有一个字符串对象,并且想要获取其中的字符数 - 它的 .Length 属性。我将如何获得隐藏在里面的 int32 数字?
提前谢谢了!
在 IL 中真的没有属性这样的东西。只有字段和方法。C# 属性构造由编译器转换为get_PropertyName
方法set_PropertyName
,因此您必须调用这些方法才能访问该属性。
代码的示例(调试)IL
var s = "hello world";
var i = s.Length;
伊利诺伊州
.locals init ([0] string s,
[1] int32 i)
IL_0000: nop
IL_0001: ldstr "hello world"
IL_0006: stloc.0
IL_0007: ldloc.0
IL_0008: callvirt instance int32 [mscorlib]System.String::get_Length()
IL_000d: stloc.1
如您所见,Length 属性是通过调用来访问的get_Length
。
我作弊了……我拿了下面的 C# 代码,在 ildasm/Reflector 中看了看
static void Main(string[] args)
{
string h = "hello world";
int i = h.Length;
}
相当于
.method private hidebysig static void Main(string[] args) cil managed
{
.entrypoint
.maxstack 1
.locals init (
[0] string h,
[1] int32 i)
L_0000: nop
L_0001: ldstr "hello world"
L_0006: stloc.0
L_0007: ldloc.0
L_0008: callvirt instance int32 [mscorlib]System.String::get_Length()
L_000d: stloc.1
L_000e: ret
}