get和set的详解
2016-06-23 19:37
190 查看
一般oop语言都要求成员变量不能直接暴露给外部访问,如下: public class A { public int Age; //这是不好的,待会有程序员可能把-1赋给Age } 为了防止乱赋值,C#设计了一个属性机制,要求把成员变量设为私有,在通过属性来控制成员变量的读写,如下: public class B { private int age; //私有成员变量 public int Age //age的属性 { get{ return age; } //读取器 set{ //写入器 if(value>0) age = value; //value是准备写入的值 } } } 这样Age就像保安一样,挡在age的前面。访问age的时候需要通过Age许可,如下: B b = new B(); b.Age = -1; //这是不行的,-1被带入value,value<0,判断不成立 b.Age = 10; //这是可行的
****************************************************************************************************************************
在程序中经常碰到get、set,不甚明白,在网上查询时也说的迷迷糊糊,所以整理下,以学的明白透彻点。 有两个类person: public class person { public string name; } public class person { public string Name{set;get;} } 第一个类型的name属性未封装,其name属性直接通过public关键字暴露给系统中的其他类了,而第二个类型的name属性通过get set关键字进行了封装,get和set分别对应的是可读和可写,相当于如下代码: private string name; public string Name { get { return name; } set { name = value; } } 简单说下区别吧:当实例化第一个“person”这个类时,系统在分配内存空间时对name属性直接分配内存,之后对name属性的操作也是直接操作内存中name属性所在的这个块;而当实例化第二个“人”类型时,系统会先分配一个叫name的private私有的内存空间,之后的读与写的操作都是通过Name这个public的类似于指针的东西来关联name进行,以此达到封装的目的,并且通过get和set关键字也可以控制可读还是可写。建议用后者,封装的好处可以参考相关文档,不再累述了~ 至于get和set的作用,除了控制读写之外还有其他的作用,举个简单的例子,比如说当我给Name赋值的时候想要先进行一些逻辑判断,就可以这样: private string name; public string Name { get { return name; } set { name = String.IsNullOrEmpty(value) ? "空" : value; } } 再举例说明下: 假设类是一银行,既能存钱也能取钱 Private Money; Private class bank() { get { return Money; } Set { Money=value; } } Money 就像银行里的自动取款机,你看不见里面的Money,但你能用set(存钱),用get(取钱)。Money是一个私有字段,是分装在类中的,类以外的程序不能直接访问的。C#中get、set用法中,类的set和get成员是外部程序访问类内部属性的唯一方法,就像你去银行取钱,你不能直接从银行的保险柜里拿钱,而是银行营业人员把钱取出来给你的。 属性在调用者看来就像一个普通的变量,但作为类的设计者,你可以利用属性来隐藏你类中的一些字段,使外界只能通过属性来访问你的字段,你可以通过属性来限制外界对你的字段的存取,就利用get、set。如果想让用户随意存取你的字段,那么就实现get、set;如果只想让用户读取字段,就只实现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方法里就行。 当你想读出或写入属性的值时,存取标志限定了被实现的语句。用于读出属性的值的存取标志记为关键字get,而要修改属性的值的读写符标志记为set。
相关文章推荐
- 盲打练习
- 聚类算法与应用
- 490 - Rotating Sentences
- ROM 、RAM和FLASH 的区别
- Problem 2191 完美的数字
- angular指令系列---多行文本框自动高度
- Linux平台下利用系统接口函数按照行读写文件
- IOS沙盒Files目录说明和常用操作
- 自定义ImageView使图片不变形
- 路径诱导系统
- 第十五周项目一-程序填空
- Servlet生命周期分为三个阶段
- 解决mysql source 命令导入数据库 乱码
- 【设计模式】数据访问对象模式
- MySQL性能调优与架构设计——第 18 章 高可用设计之 MySQL 监控
- Android Studio NDK 开发
- Modular Inverse
- 【Unity3D实战】零基础一步一步教你制作酷跑类游戏(1)
- Android消息机制---Handler工作原理
- JQ 练习题