关于C#属性的秘密
c#属性给变成人员提供了很大的方便,这一点C#的程序员应该感受很深,有的时候我不不得不感叹C#语言的神奇。有个一定经验的程序员都清楚,属性(get,set)在内部其实被C#编译器解释成两个函数,例如下面我们定义一个Circle类并定义它直径,和周长
public class Circle
{
private Int32 perimeter;
public Int32 Perimeter
{
get { return perimeter; }
set { perimeter = value; }
}
private Int32 diameter;
public Int32 Diameter
{
get { return diameter; }
set { diameter = value; }
}
}
看源文件,属性被编译成了下面四个方法

就相当于java的get和set 方法,不过编译器帮我们做了很多事,而我介绍的重点不在于介绍属性被编译成了两种方法,而在于下面属性的另一中用法。
如果我们想下面这样声明类型以及属性,并使用它,会发生什么事情呢?
public class Circle
{
public Int32 Perimeter
{
get;
set;
}
public Int32 Diameter
{
get;
set;
}
}
class Program
{
static void Main(string[] args)
{
Circle circle = new Circle();
circle.Diameter = 5;
circle.Perimeter = 5;
Console.WriteLine(circle.Diameter.ToString());
Console.WriteLine(circle.Perimeter.ToString());
}
}
上面的写法是正确的吗?毫无疑问,绝对正确,可是我不是说过,属性其实被编译解释成两个方法吗,怎么能够存储实例字段的值呢,我在类中并未声明任何实例字段,但是它却存储了字段的值,并且显示结果为 5,5到底是怎么回事呢、其实,我们理解的一切都是正确的,属性的确只会被编译成方法,不可能存储字段的值,只不过编译器有帮我们做了,声明实例字段的工作,我们看元数据就明白一切了。

原来编译器帮我们定义了两个实例字段,跟类型中定义的两个属性紧密联系在一起,这样,我们应该对属性有比较深刻的认识了吧!
浙公网安备 33010602011771号