前篇链接:Unity之C#学习笔记(11):静态类型 Static
在这节,我们来介绍属性(Properties)。你可以把属性理解为一个“智能”的变量。在外部,你可以像访问变量一样访问属性。属性的智能体现在两方面:一是可以控制变量的访问权限,二是可以对变量的读写过程做自定义的控制。
先来看如何创建一个属性。属性本身不包含一个变量,需要与一个声明的变量相联系。属性内有两个域(访问器):get和set。get就是外部读取这个属性时会执行的部分,所以需要一个与声明的类型相对应的返回值;set是外部修改这个属性时会执行的部分,关键字value会存储外部传入的值。所以最基本的,我们会这样写一个属性:
public bool isGameOver;
public bool IsGameOver
{
get
{
return isGameOver;
}
set
{
isGameOver = value;
}
}
Tips:属性名应该以大写字母开头
如上所示,我们先创建了一个isGameOver变量,然后创建了对应的IsGameOver属性。在get访问器中,我们返回了isGameOver的值;在set访问器中,我们将外部传入的值value赋给了isGameOver。显然,现在我们在外部访问isGameOver变量和IsGameOver属性的效果是完全一样的。在外部看来,我们的属性是这样子的:
在面向对象的程序设计中,封装是非常重要的一种思想。我们会尽量使用private修饰符来保护无需对类外暴露的变量。但如果我们想创建一个对外只能读取不能修改的变量,怎么做?显然这个变量不能是public修饰的,但private又会使这个变量对外不可见。而在属性中,变量的访问被分为了两个域:get和set。那么我们只需要去掉set访问器,就可以让它关联的private变量实质上对外变为只读状态。但是这样会导致我们在类内也无法对其进行修改,所以要使用private set,或者protected set,如果希望在继承类中也可修改。
另一方面,在get和set中我们完全可以像在一个方法中自由操作(实际上,属性的实现就是利用了方法),所以可以在其中加入一些其它逻辑。但是也不宜过于复杂,因为外部的访问有很大的不确定性,可能导致一些难以预料的错误发生。
对于上面的isGameOver进行一些改写:
private bool isGameOver;
public bool IsGameOver
{
get
{
return isGameOver;
}
private set
{
isGameOver = value;
if (isGameOver == true)
{
Debug.Log("Oops, the game is over");
}
}
}
我们之前用到过的Time.deltaTime就是一个只读属性。
原文地址:https://blog.csdn.net/Altair_alpha/article/details/105775889
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。