欢迎光临

木子屋

标题: 通过ildasm查看省略get,set块代码的区别

作者: dnawo

日期: 2011-01-15 03:08 PM

分类: Web编程

内容: 平时在定义类属性时一般都这么写：
复制内容到剪贴板 程序代码class Person
{
private string name;
private int age;
public string Name
{
get { return name; }
set { name = value; }
}
public int Age
{
get { return age; }
set { age = value; }
}
}
前几天看别人的代码，才知道get,set块中的代码可以省略的，并且使用起来也没什么不同：
复制内容到剪贴板 程序代码class Person
{
public string Name
{
get;
set;
}
public int Age
{
get;
set;
}
}
它们有什么区别呢？打开ildasm看了下：
很明显，省略get,set块中的代码后编译器自动声明两个字段<Name>k__BackingField和<Name>k__BackingField，等效于我们手工声明的name和age。再看下MSIL代码：
复制内容到剪贴板 程序代码.method public hidebysig specialname instance string
get_Name() cil managed
{
// 代码大小 7 (0x7)
.maxstack 8
IL_0000: ldarg.0
IL_0001: ldfld string ConsoleApplication1.Person::name
IL_0006: ret
} // end of method Person::get_Name
.method public hidebysig specialname instance void
set_Name(string 'value') cil managed
{
// 代码大小 8 (0x8)
.maxstack 8
IL_0000: ldarg.0
IL_0001: ldarg.1
IL_0002: stfld string ConsoleApplication1.Person::name
IL_0007: ret
} // end of method Person::set_Name
复制内容到剪贴板 程序代码.method public hidebysig specialname instance string
get_Name() cil managed
{
.custom instance void [mscorlib]System.Runtime.CompilerServices.CompilerGeneratedAttribute::.ctor() = ( 01 00 00 00 )
// 代码大小 7 (0x7)
.maxstack 8
IL_0000: ldarg.0
IL_0001: ldfld string ConsoleApplication1.Person::'<Name>k__BackingField'
IL_0006: ret
} // end of method Person::get_Name
.method public hidebysig specialname instance void
set_Name(string 'value') cil managed
{
.custom instance void [mscorlib]System.Runtime.CompilerServices.CompilerGeneratedAttribute::.ctor() = ( 01 00 00 00 )
// 代码大小 8 (0x8)
.maxstack 8
IL_0000: ldarg.0
IL_0001: ldarg.1
IL_0002: stfld string ConsoleApplication1.Person::'<Name>k__BackingField'
IL_0007: ret
} // end of method Person::set_Name
当然了，这么省略也是有前提条件的，那就是不需要对属性进行一些额外的处理，比如赋值时不需检测值的有效性，否则还是不能省略的。

+ 查看当前日志评论 (0)

登录

────────────

木子屋

PJBlog3 v3.2.9.518 Inside.

Processed In 0.973 ms

返回

标题: 通过ildasm查看省略get,set块代码的区别

你没有权限发表评论

────────────

木子屋

PJBlog3 v3.2.9.518 Inside.

Processed In 0.973 ms

返回

暂无评论

返回

────────────

木子屋

PJBlog3 v3.2.9.518 Inside.

Processed In 1.004 ms

返回