C#属性的实质还是方法
C# 中类的属性,编译成中间语言后是 get、set 两个方法,调用属性实际上是调用 get 或 set 方法。
这一点刚接触 C# 时就学到过,但没往心里去。今天修改了项目类库中的一个类,把原来一个公共字段用一个同名可读写的属性实现。本来想着在其它调用这个字段的地方,因为调用属性和调用字段语法完全一样,名字也没变,代码是不用改的。但却发现程序运行不了,提示找不到原来的那个字段。用 ildasm 打开新的程序集文件一看,顿时明白了怎么回事儿:属性的实质还是方法,get 对应名为“get_属性名”的方法,set 对应名为“set_属性名"的方法,这在 IL 代码中写的清清楚楚。调用属性的地方实际上是调用 get 或 set 方法。
示例类:
public class Person
{
public string Name;
private int _age;
public int Age
{
get{ return _age; }
set{ _age = value; }
}
}
用 ildasm 看到的:
get 和 set 方法在 Java 中是司空见惯的,在 C# 中用属性这种形式实现,虽然用起来像字段,但不能忘了其实质还是方法。我遇到的问题只要把用到这个字段的程序集重新编译一遍即可解决,确实不需要修改代码。