Unity之C#学习笔记(12):属性 Properties

前篇链接: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就是一个只读属性。

在这里插入图片描述
如果不需要在get和set中做额外的操作,还可以使用自动属性。在上例中,我们先声明了isGameOver变量,再声明IsGameOver属性,看起来有些繁琐。实际上,有了属性,我们已经不需要直接访问原来的变量了。利用自动属性,我们只需要声明属性,编译器会帮我们自动生成一个隐藏的变量,格式如下:

在这里插入图片描述
可以看到效果和上例是完全一样的。

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值