c#中属性的应用

属性,官方的解释是:它提供灵活的机制来读取、编写或计算某个私有字段的值。 可以像使用公共数据成员一样使用属性,但实际上它们是称作“访问器”的特殊方法。 这使得可以轻松访问数据,此外还有助于提高方法的安全性和灵活性。我们可以简单的理解成它是访问类中私有成员的一种工具。类中个private的成员不能直接在外部访问,我们调用他们的一种方法是通过类中的成员函数,还有一种方法就是通过属性。属性中有get(用于返回属性值)方法和set(用于分配新值)方法。下面我们看一个简单的例子:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
    class MyClass
    {
        private int integer;
        public int Integer
        {
            get { return integer; }
            set { integer = value; }
        }
    }
    class Test
    {
        public static void main()
        {
            MyClass MyObject = new MyClass();
            Console.Write(MyObject.Integer);
            MyObject.Integer++;
            Console.Write(MyObject.Integer);
        }

    }

一如我们期待的那样,程序输出0 1。我们可以看到属性通过对方法的包装向程序员提供了一个友好的域成员的存取界面。这里的value是C#的关键字,是我们进行属性操作时的set的隐含参数,也就是我们在执行属性写操作时的右值。 
   
     属性提供了只读(get),只写(set),读写(get和 set)三种接口操作。对域的这三种操作,我们必须在同一个属性名下声明,而不可以将它们分离,看下面的实现: 
   
   class MyClass 
   { 
       private string name; 
   
       public string Name 
       { 
           get { return name; } 
       } 
       public string Name 
       { 
           set { name = value; } 
       } 
   } 
   
   
     上面这种分离Name属性实现的方法是错误的!我们应该像前面的例子一样将他们放在一起。值得注意的是三种属性(只读,只写,读写)被C#认为是同一个属性名,看下面的例子: 
   
   class MyClass 
   { 
       protected int num=0; 
       public int Num 
       { 
           set 
           { 
               num=value; 
           } 
       } 
   } 
   class MyClassDerived: MyClass 
   { 
       new public int Num 
       { 
           get 
           { 
               return num; 
           } 
       } 
   } 
   
   class Test 
   { 
       public static void Main() 
       { 
           MyClassDerived MyObject = new MyClassDerived(); 
           //MyObject.Num= 1; //错误 ! 
           ((MyClass)MyObject).Num = 1; 
       } 
   } 
   
   
     我们可以看到MyClassDerived中的属性Num-get{}屏蔽了MyClass中属性Num-set{}的定义。 
   
     当然属性远远不止仅仅限于域的接口操作,属性的本质还是方法,我们可以根据程序逻辑在属性的提取或赋值时进行某些检查,警告等额外操作,看下面的例子: 
   
   class MyClass 
   { 
       private string name; 
       pubng Name 
       { 
           get { return name; } 
           set 
           { 
               if (value==null) 
                   name="Microsoft"; 
               else 
                   name=value; 
           } 
       } 
   } 
   
     由于属性的方法的本质,属性当然也有方法的种种修饰。属性也有5种存取修饰符,但属性的存取修饰往往为public,否则我们也就失去了属性作为类的公共接口的意义。除了方法的多参数带来的方法重载等特性属性不具备外, virtual, sealed, override, abstract等修饰符对属性与方法同样的行为,但由于属性在本质上被实现为两个方法,它的某些行为需要我们注意。看下面的例子: 
   
   abstract class A 
   { 
       int y; 
       public virtual int X 
       { 
           get { return 0; } 
       } 
       public virtual int Y 
       { 
           get { return y; } 
           set { y = value; } 
       } 
       public abstract int Z { get; set; } 
   } 
   class B: A 
   { 
       int z; 
       public override int X 
       { 
           get { return base.X + 1; } 
       } 
       public override int Y 
       { 
           set { base.Y = value < 0? 0: value; } 
       } 
       public override int Z 
       { 
           get { return z; } 
           set { z = value; } 
       } 
   } 
   
     这个例子集中地展示了属性在继承上下文中的某些典型行为。这里,类A由于抽象属性Z的存在而必须声明为abstract。子类B中通过base关键字来引用父类A的属性。类B中可以只通过Y-set便覆盖了类A中的虚属性。 
   
     静态属性和静态方法一样只能存取类的静态域变量。我们也可以像做外部方法那样,声明外部属性。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值