关于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到底是怎么回事呢、其实,我们理解的一切都是正确的,属性的确只会被编译成方法,不可能存储字段的值,只不过编译器有帮我们做了,声明实例字段的工作,我们看元数据就明白一切了。

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

posted on 2011-09-06 15:26  yuanyi  阅读(266)  评论(0)    收藏  举报