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属性,看起来有些繁琐。实际上,有了属性,我们已经不需要直接访问原来的变量了。利用自动属性,我们只需要声明属性,编译器会帮我们自动生成一个隐藏的变量,格式如下:

在这里插入图片描述

可以看到效果和上例是完全一样的。

原文地址:https://blog.csdn.net/Altair_alpha/article/details/105775889

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


这篇文章主要介绍了Unity游戏开发中外观模式是什么意思,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家...
这篇文章主要介绍Unity中地面检测方案的示例分析,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!1.普通射线在角色坐标(一般是脚底)...
这篇文章主要介绍了Unity游戏开发中如何消除不想要的黄色警告,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带...
这篇文章主要介绍了Unity中有多少种渲染队列,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解
这篇文章主要介绍Unity中如何实现Texture,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!了解Texture2D 如上图,Texture2D是一张
小编给大家分享一下Unity中DOTS要实现的特点有哪些,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让...
这篇文章给大家分享的是有关unity中如何实现UGUI遮罩流光特效的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。下面是核心shader:Sh...
这篇文章主要为大家展示了“Unity中如何实现3D坐标转换UGUI坐标”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下...
这篇文章主要介绍了Unity游戏开发中设计模式的示例分析,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家...
这篇文章主要介绍了Unity中如何实现仿真丝袜渲染,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了...
这篇文章给大家分享的是有关Unity插件OVRLipSync有什么用的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。项目需要接入对话口型动...
这篇文章主要介绍了Unity性能优化之DrawCall的示例分析,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家...
这篇文章给大家分享的是有关Unity给力插件之Final IK怎么用的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。这插件有什么用:一般游...
这篇文章给大家分享的是有关Unity中如何内嵌网页插件UniWebView的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。一、常见Unity中内...
小编给大家分享一下Unity如何做流体物理的几个轮子,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让...
小编给大家分享一下Unity中Lod和Occlusion Culling的示例分析,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收...
这篇文章将为大家详细讲解有关Unity中LineRenderer与TrailRenderer有什么用,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获...
这篇文章主要介绍了Unity中coroutine问题的示例分析,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起...
这篇文章将为大家详细讲解有关unity中spine怎么用,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。骨骼动画首先我们来看到...
这篇文章主要为大家展示了“Unity Shader后处理中如何实现简单均值模糊”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学...