【C# 教程系列第 1 篇】什么是 c# 中的属性访问器 get 和 set (精讲)

这是【C# 教程系列第 1 篇】,如果觉得有用的话,欢迎关注专栏。

一:项目底分代码

1-1:未使用 get set 访问器的代码

在讲解 get 和 set 访问器之前,为了更方便理解,先说一个例子。

今天做项目的时候,在创建房间界面有一个底分的选项,要求底分的范围在1-20 之间。

我另外创建了一个项目,面板如下
在这里插入图片描述
这里我写了一个 “GetSetTest” 的脚本,声明了一个底分的变量 cellScore 和点击 加 减 按钮后显示底分的 Label,因为是测试,这里按钮就用了挂载的方式来执行相应的方法。详细代码如下:
在这里插入图片描述
当点击加号按钮时,底分的确最小 1,最大 20(因为用 CSDN 比较少,还不会弄动态图,周末了学习下)
在这里插入图片描述
如果仅仅是为了实现功能而言,这样写也完全没问题,但如果从开发项目的代码安全角度来考虑,这样写是肯定不行的。

1-2:使用了 get set 访问器的代码

项目里我是这样写的,声明一个私有字段 cellScore,对该字段进行属性的封装(c# 在定义类时,通常要把类中声明的对象封装起来,使得外界不能访问这个属性),详细代码如下:

对属性的封装
在这里插入图片描述
调用封装后的函数
在这里插入图片描述
这样写也能实现底分的取值范围是1~20之间。

实现了同样的功能,却更能保证代码的安全性(写的多了后,就会慢慢改善,起初只是为实现功能而写代码,后面就不仅仅是实现功能的问题了,至于有什么,工作中体会吧,此处省略一万字……)

二:什么是 get,set 访问器

英文理解
get 就是获得什么,而set 是设置什么。

官方定义
get 是读取属性时进行的操作,set 是设置属性时进行的操作。定义一个属性如果只有 get,这个属性就是只读的。同样,只有set,属性就是只写的。

value 关键字
用于定义由 set 取值函数分配的值。

2-1:只读,只写说明

比如一个 string name 的字段

只读
你想在控制台打印 name 的值,就要先获取(get) 到 name 的值,如果没有 get 访问器,你是不能在控制台打印 name 的值的。

只写
就是你为 name 字段赋值,例如 name=“Allen Su”,如果没有 set 访问器,你是不能为 name 赋值的(当然,只写的属性意义不是很大)

我们声明一个字段的时候,明明自己没有写 get,set 访问器,但为什么还能为其赋值并读取该值呢?
因为默认情况下,如果不特别说明,系统会默认该字段既能读,也能写,这点系统底层已经为我们进行了封装。

下面两行代码是相同的。

图一:
在这里插入图片描述
图二
在这里插入图片描述
上述代码中如果去掉 set 部分,则外界只能读取 cellScore 的值,如果去掉 get 部分,则只能给 cellScore 赋值。这样就可以控制外界对私有属性 name 的访问权限了,这种写法是 C# 的一个特性。

三:通过"银行存取钱"案例认识 get set 访问器

Bank:银行,money:钱。

我们通过银行存取钱案例,来了解一下 get 和 set 访问器,如下图
在这里插入图片描述
Money 属性就像银行里的自动存取款机,你看不见里面的 money,但你能用 set(存钱),用 get(取钱)。

money 是一个私有字段,是封装在类中的,类以外的程序不能直接访问的,类的 set 和 get 成员是外部程序访问类内部属性的唯一方法。

就像你去银行取钱,你不能直接从银行的保险柜里拿到钱,而是银行营业人员把钱取出来给你的。

那我们设置 Money 属性,怎么使用呢?如下图
在这里插入图片描述
这里我分别设置断点在 get,set 访问器中,点击下图所示按钮,把 vs 的断点调试附加到 unity 中,如下图
在这里插入图片描述
在 Start 函数里调用 UseMoney 方法,如下图:
在这里插入图片描述
运行 unity ,如下图
在这里插入图片描述
当调用 UseMoney 方法时,在为 bank.Money 赋值等于 15 时程序会停下

按下F11逐语句执行程序,如下图
在这里插入图片描述
可见,当执行代码 bank.Money = 15;时,就会进入属性中的 set 访问器。

同理:把 bank.Money 的值赋给 a 变量的时候,会进入到属性中的 get 访问器,如下两个图
在这里插入图片描述
在这里插入图片描述
当然,这个是 get 和 set 访问器最基本的应用。

四:为什么要用 get 和 set 访问器

通过 get 和 set 对公有变量 Money 进行读写操作,实际就是间接更改 money 私有变量的值,那既然如此。为何不设 money 为public,让实例直接对 money 进行读写操作呢?我们是不是在多此一举呢?

其实,我当初刚接触 get 和 set 也不是很理解,并不是说他们的含义难理解,而是为什么要用?为何不直接用个 public 的字段变量来代替呢?(你们是不是也有过这疑问呢?)

接下来就来说明下,为什么要用这对访问器?

原因一:用 get 和 set 能让赋值和取值增加限制,如下图
在这里插入图片描述
这样的话,我们是永远无法给 Money 属性赋值负的金钱。

其实这种应用在实际项目中,属性设置非常常见,比如我在项目中的底分。

如果在 set 访问器中设置这个属性的一些特性,比如说不能为空,长度大小,必须为数字,各类正则表达式等等,然后抛出异常,表示层再来接受,这样就可以少写很多验证程序了。

原因二: 封装性、安全性、完整性
这三个概念性比较强,从字面意思上好理解,但不是一两句话可以总结的,我们记住这三个特性即可。

PS:昨天写的这篇博客,但是时间不太够,感觉匆忙写一个大家再看不懂,还不如整理好再发。操碎了我这颗炽热的心啊。坚持写了一个月的博客了,还是没人给评论和转载,看来还需要加倍努力啊。写博客挺不容易的,不能有错别字,这样写好不好,注释别人可以看懂吗等等都需要考虑,不过,我现在慢慢的喜欢上写博客了,每天进步一点点,大家一起加油吧!

你的问题得到解决了吗?欢迎在评论区留言。

赠人玫瑰,手有余香,如果觉得文章不错,希望可以给个一键三连,感谢。


结束语

技术是一点一点积累的,大神也不是一天就可以达到的。原地不动就是退步,所以每天进步一点点。

最后,附上一句格言:"好学若饥,谦卑若愚",望共勉。
评论 25
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Allen Su

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值