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,
- 如果你想让用户随意存取你的字段,那么就实现set和get,
- 如果只想让用户读取字段,就只实现get,
- 若只想让用户写字段就只实现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; } }