C#中get,set的自我总结


假设类是一个银行,既能存钱也能取钱.

private m_money;
private class bank()
{
get { return m_money ;}
set { m_money = value ;}         
}


m_money 就像银行里的自动存取款机,你看不见里面的money,但你能用set(存钱),用get(取钱)。

m_money是一个私有字段,是分装在类中的,类以外的程序不能直接访问的,类的set 和get成员是外部程序访问类内部属性的唯一方法,就像你去银行取钱,你不能直接从银行的保险柜里拿到钱,而是银行营业人员把钱取出来给你的.

属性在调用者看来就像一个普通的变量,普通变量怎么用,它就怎么用,但作为类的设计者,你可以利用属性来隐藏你类中的一些字段,使外界只能通过属性来访问你的字段,你可以通过属性来限制外界对你的字段的存取,就利用get,set

  1. 如果你想让用户随意存取你的字段,那么就实现set和get,
  2. 如果只想让用户读取字段,就只实现get,
  3. 若只想让用户写字段就只实现set,


同时你还可以在set和get中对用户传递来的值进行一些验证工作,以确保你的字段将含有正确的值。

比如

private int a;
public int Index
{
get{ return a; }
set{   if (value>0) a=value;      else   a=0; }
}


可以看出,get/set有一种函数的特征。

  • 一则是隐藏组件或类内部的真实成员,
  • 二是用来建立约束的,比如,实现“有我没你”这种约束。
  • 三是用来响应属性变化事件,当属性变化时做某事,只要写在SET 方法里就行了。



一些加深理解的具体例子:

1.

可以将 get 访问器用于返回字段值,或用于计算字段值并将其返回。例如:

public string Name
{       
       get    {      return name != null ? name : "NA";   }  
}

在上述代码段中,如果不对 Name 属性赋值,它将返回值 NA。

2.

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;
    }
} 

3.对所有有必要在类外可见的域,C#推荐采用属性来表达。属性不表示存储位置,这是属性和域的根本性的区别。下面是一个典型的属性设计:

using System;  
class MyClass  
{  
        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);
    }  
} 

4.方便更改需求 如果说有人让你把所有的StrName都加一个"_"的前缀那么如果public string strName;,你用了100个地方,就要改100个地方但是使用属性,你只要改一处就好

private string strName;
        public string StrName
        {
            get { return "_"+strName; }
            set { strName = value; }
        }



posted @ 2013-06-07 22:12  金靴欧文  阅读(285)  评论(0编辑  收藏  举报