• C#属性(Property)

    属性(property)是一种用于访问对象或类的特性的成员。

    属性提供灵活的机制来读取、编写或计算私有字段的值。

    属性提供了一种机制,它把读取和写入对象的某些特性与一些操作关联起来。

    可以像使用公共数据成员一样使用属性,但实际上属性是称为“访问器”的一种特殊方法,这使得数据在被轻松访问的同时,仍能提供方法的安全性和灵活性。

    无参属性

    一般看来,常量和字段已经足够刻画实际生活中对象的各种参数。实际上也确实是这样。

    属性(property)是一种"高级字段”,它可能带有一个 getter 和一个 setter,它们保护属性的值,使之不会被外部胡乱篡改。

    和字段相比,属性实现了对成员的封装。

    Java 中有相似的概念(JavaBeans),它要求类中的成员都是私有的,并且提供一个 public 的 getter 和一个 setter,用于让外界访问和修改私有字段的值。

    这两个方法的名称以 get 和 set 开头,需要自己手写。

    在 C# 中,也可以通过字段和一对读写方法,自己手动实现属性:

    class A
    {
        private int c;
        public int getC()
        {
            return c;
        }
        public void setC(int value)
        {
            c = value;
        }
    }

    在这里的私有字段称为支持字段(Backing Field)。

    不过,这样做有两个明显缺点,一是必须手打这些代码;二是在访问属性时,必须调用方法,而不能直接使用点号加属性名。

    CLR 提供了称为属性的机制,解决了这两个缺点。下面的写法是经过简化了的写法:

    private int c { get;  set;  }

    如果不想属性有任何特殊行为,从 C# 3 开始,可以使用简易语法get; set;

    这样创建的属性叫做自动实现的属性。另外,我们可以直接通过 A.c 访问属性,而非使用 A.getCA.setC 方法了。

    实际上,无参属性仅仅是语法糖。通过编译之后使用 iladsm 查看,我们可以发现,编译器自动为我们生成了 get_c 和 sct_c 方法,以及一个支持字段 <c>k_BackingField,如下图所示。

    自动实现的属性

更多...

加载中...