Unity 变量修饰符 之protected ,internal,const , readonly, static

文章目录

  • protected
  • internal
  • const
  • readonly
  • static

在这里插入图片描述

protected

当在Unity中使用C#编程时,protected是一种访问修饰符,用于控制类成员(字段、方法、属性等)的可见性和访问权限。protected修饰的成员可以在当前类内部、派生类(子类)内部以及同一命名空间中的其他类中访问,但在类的外部是不可见的。以下是更详细的说明和示例:

特性和用法:

  • protected修饰符允许成员在继承关系中被继承和访问。
  • protected成员可以在子类中被重写(方法)或扩展(字段和属性)。
  • protected成员不允许直接在类外部访问,但可以在继承的子类中通过基类的实例进行访问。

示例:

// 基类(父类)
public class Animal
{
    protected string species; // 只在当前类及其子类中可见

    public Animal(string species)
    {
        this.species = species;
    }

    protected void MakeSound()
    {
        Debug.Log("Animal makes a sound");
    }
}

// 派生类(子类)
public class Dog : Animal
{
    public Dog() : base("Dog")
    {
        // 子类可以访问基类的受保护字段和方法
        species = "Canine";
        MakeSound(); // 调用基类的受保护方法
    }

    public void Bark()
    {
        Debug.Log("Dog barks");
    }
}

// 在其他类中使用
public class GameManager
{
    void Start()
    {
        // 在这里不能直接访问Animal类的protected成员
        // Animal animal = new Animal("Generic Animal");
        // animal.species = "Unknown"; // 错误!无法访问

        Dog dog = new Dog();
        // 可以访问基类中的protected字段和方法
        dog.species = "Domestic Dog"; // 合法,因为是在子类中访问
        dog.MakeSound(); // 合法,因为是在子类中访问

        dog.Bark(); // 调用子类的公共方法
    }
}

在这个示例中,Animal类作为基类(父类),拥有一个protected字段species和一个protected方法MakeSound()Dog类作为派生类(子类),继承了Animal类,并能够访问基类的protected成员。Dog类还定义了自己的公共方法Bark()

GameManager类中,我们不能直接访问Animal类的protected成员,但可以通过Dog类的实例来访问。这展示了protected修饰符在继承关系中的作用,允许子类访问基类的受保护成员,但不允许在类外部直接访问。

internal

在C#编程语言以及在Unity游戏开发中,internal是一种访问修饰符,用于控制类成员的可见性和访问权限。internal修饰的成员可以在同一个程序集(assembly)内的任何类中访问,但在程序集之外是不可见的。下面是更详细的介绍和示例:

特性和用法:

  • internal修饰符用于声明类内部的成员,这些成员可以在同一个程序集中的其他类中访问,但在程序集外部不可见。
  • internal成员对于实现模块内的细节和隐藏数据非常有用,同时又不会暴露给程序集之外的代码。

示例:

假设你正在开发一个Unity游戏,包含以下几个脚本文件:

  1. Player.cs
using UnityEngine;

public class Player : MonoBehaviour
{
    internal int playerScore; // 在同一个程序集内的其他类中可见

    internal void UpdateScore(int points)
    {
        playerScore += points;
    }
}
  1. GameManager.cs
using UnityEngine;

public class GameManager : MonoBehaviour
{
    void Start()
    {
        Player player = new Player();
        player.UpdateScore(10); // 在同一个程序集内的类中可以访问internal方法和字段
        Debug.Log("Player score: " + player.playerScore);
    }
}

在这个示例中,Player类和GameManager类都在同一个程序集(Unity项目)内。Player类中的字段playerScore和方法UpdateScore()被声明为internal,因此它们可以在同一个程序集中的其他类中访问,比如在GameManager类中。

然而,如果我们尝试在程序集之外的类中访问playerScoreUpdateScore(),就会引发编译错误。

总结起来,internal修饰符在Unity开发中用于控制类成员的可见性,确保这些成员只在同一个程序集内可见。这对于隐藏内部细节、实现模块化以及防止未授权访问非常有用。

const

在C#编程语言以及在Unity游戏开发中,const是一个关键字,用于声明常量。常量是一种在程序运行期间不能被修改的值,它们在声明时必须被初始化,并且一旦初始化后,就不能再更改。下面是更详细的介绍和示例:

常量特性和用法:

  • const关键字用于声明常量,一旦声明并初始化,其值在程序的整个生命周期内保持不变。
  • 常量必须在声明时进行初始化,并且只能在声明语句中初始化。
  • 常量只能包含基本数据类型(如整数、浮点数、布尔值)以及字符串类型。
  • 常量在编译时进行值的替换,这有助于提高代码的性能。

示例:

public class Constants
{
    public const int MaxPlayerHealth = 100;
    public const float Gravity = 9.81f;
    public const string GameTitle = "My Awesome Game";
}

public class Player : MonoBehaviour
{
    private int health = Constants.MaxPlayerHealth;

    void Update()
    {
        if (Input.GetKeyDown(KeyCode.Space))
        {
            health -= 10;
            Debug.Log("Player health: " + health);
        }
    }
}

在这个示例中,Constants类定义了三个常量:MaxPlayerHealthGravityGameTitle。这些常量在声明时进行了初始化,并且它们在整个程序运行期间保持不变。

Player类中,我们使用Constants.MaxPlayerHealth来初始化玩家的健康值,并在每次按下空格键时减少玩家的健康值。因为MaxPlayerHealth是一个常量,其值在编译时就已经被确定,并且在运行时不会被修改。

总之,const关键字用于声明常量,这些常量在程序运行期间保持不变。常量适用于需要使用固定值的情况,如最大值、常用常数等。在Unity开发中,常量可以用于避免魔术数值、提高代码可读性以及确保某些值不会被错误地修改。

readonly

在C#编程语言中,readonly是一个关键字,用于声明只读字段。只读字段是在声明时初始化,之后不能再修改其值。与之相反,const用于声明编译时常量,而readonly用于在运行时只允许初始化一次的字段。以下是更详细的介绍和示例:

readonly特性和用法:

  • readonly关键字用于声明只读字段,这些字段必须在声明时或在构造函数中初始化,之后不能再修改。
  • readonly字段通常用于在类的实例生命周期内保持不变的值,但允许在构造函数中根据需要进行初始化。
  • const不同,readonly字段的值是在运行时确定的,可以根据对象的状态来初始化。

示例:

public class Circle
{
    public readonly float Radius; // 只读字段

    public Circle(float radius)
    {
        Radius = radius; // 在构造函数中初始化只读字段
    }

    // 错误!无法在类外部赋值给只读字段
    // public void UpdateRadius(float newRadius)
    // {
    //     Radius = newRadius;
    // }
}

public class Program
{
    static void Main(string[] args)
    {
        Circle circle = new Circle(5.0f);
        Console.WriteLine("Circle radius: " + circle.Radius); // 输出:5

        // 错误!无法在类外部修改只读字段的值
        // circle.Radius = 10.0f;
    }
}

在这个示例中,Circle类定义了一个只读字段Radius,它在构造函数中进行了初始化。一旦初始化后,就无法再修改Radius的值。在Program类中,我们创建了一个Circle对象,通过只读字段Radius来存储圆的半径,并在输出中显示了半径的值。

需要注意的是,readonly字段在声明时或在构造函数中初始化后,就不能再在其他地方修改。这对于确保一些值在对象的生命周期内保持不变非常有用,同时也允许在构造函数中初始化基于特定条件的值。

static

在C#编程语言中,static是一个关键字,用于声明静态成员、方法和类。静态成员与特定实例无关,它们在整个应用程序的生命周期中保持不变。静态成员可以通过类名直接访问,无需创建类的实例。以下是更详细的介绍和示例:

static特性和用法:

  • static关键字用于声明静态成员,这些成员与类关联,而不是与类的实例(对象)关联。
  • 静态成员在内存中只有一份副本,无论创建多少个类的实例,它们的值都是相同的。
  • 静态成员在整个应用程序的生命周期中保持不变,可以在不创建类的实例的情况下访问。

静态方法的特点:

  • 静态方法可以直接通过类名调用,无需创建类的实例。
  • 静态方法内部不能访问实例成员,因为它们没有与特定实例关联。
  • 静态方法通常用于不依赖于实例状态的操作,如数学函数、工具方法等。

静态字段的特点:

  • 静态字段是与类关联的字段,所有类的实例共享同一个字段。
  • 静态字段通常用于保存全局共享的状态,如计数器、配置值等。

示例:

public class MathUtils
{
    public static int Add(int a, int b)
    {
        return a + b;
    }
}

public class Counter
{
    private static int count; // 静态字段

    public static void Increment()
    {
        count++;
    }

    public static int GetCount()
    {
        return count;
    }
}

public class Program
{
    static void Main(string[] args)
    {
        int sum = MathUtils.Add(5, 3); // 调用静态方法
        Console.WriteLine("Sum: " + sum);

        Counter.Increment(); // 调用静态方法
        Console.WriteLine("Count: " + Counter.GetCount()); // 输出:1
    }
}

在上面的示例中,MathUtils类定义了一个静态方法Add(),可以通过类名直接调用。Counter类定义了一个静态字段count和两个静态方法,用于计数器的增加和获取。在Program类中,我们调用了MathUtils.Add()静态方法和Counter类的静态方法来展示静态成员的使用。

总之,static关键字在C#中用于声明静态成员,这些成员在整个应用程序的生命周期中保持不变,无需创建类的实例即可访问。静态成员在全局共享状态、提供工具函数等方面具有重要作用。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/81639.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Windows上使用FFmpeg实现本地视频推送模拟海康协议rtsp视频流

场景 Nginx搭建RTMP服务器FFmpeg实现海康威视摄像头预览: Nginx搭建RTMP服务器FFmpeg实现海康威视摄像头预览_nginx rtmp 海康摄像头_霸道流氓气质的博客-CSDN博客 上面记录的是使用FFmpeg拉取海康协议摄像头的rtsp流并推流到流媒体服务器。 如果在其它业务场景…

嵌入式设计中对于只有两种状态的变量存储设计,如何高效的对循迹小车进行偏差量化

前言 (1)在嵌入式程序设计中,我们常常会要对各类传感器进行数据存储。大多时候的传感器,例如红外光传感器,返回的数据要么是0,要么是1。因此,只需要一bit就能够存储。而很多人却常常使用char型数…

SkyEye操作指南:连接TI CCS的IDE调试

现代电力电子控制系统的开发中,DSP芯片以其优越的运算性能在控制算法领域得到越来越广泛的应用。传统的DSP开发过程往往需要在完成控制系统仿真与程序设计后,才能根据比对结果进行程序修改,全过程还需要硬件电路工程师的配合,开发…

ES的索引结构与算法解析

提到ES,大多数爱好者想到的都是搜索引擎,但是明确一点,ES不等同于搜索引擎。不管是谷歌、百度、必应、搜狗为代表的自然语言处理(NLP)、爬虫、网页处理、大数据处理的全文搜索引擎,还是有明确搜索目的的搜索行为,如各大…

Git判断本地是否最新

场景需求 需要判断是否有新内容更新,确定有更新之后执行pull操作,然后pull成功之后再将新内容进行复制到其他地方 pgit log -1 --prettyformat:"%H" HEAD -- . "origin/HEAD" rgit rev-parse origin/HEAD if [[ $p $r ]];thenecho "Is La…

【Android】设置-显示-屏保-启用时机-默认选中“一律不“

设置-屏保-启用时机-默认选中"一律不" 解决步骤(1)理清思路(2)过程(3)效果图 解决步骤 (1)理清思路 操作步骤: 首先手机进入设置—》点进显示选项—》进入后…

D. Anton and School - 2

范德蒙德恒等式 考虑统计每一个右括号位置的贡献&#xff0c;也就是每个右括号作为右边起点的贡献 其中i0的时候&#xff0c;r-1<r-0,故i0时贡献为0&#xff0c;直接套用恒等式不会有影响 #include <bits/stdc.h> using namespace std; typedef long long int ll; # d…

分布式锁实现方式

分布式锁 1 分布式锁介绍 1.1 什么是分布式 一个大型的系统往往被分为几个子系统来做&#xff0c;一个子系统可以部署在一台机器的多个 JVM(java虚拟机) 上&#xff0c;也可以部署在多台机器上。但是每一个系统不是独立的&#xff0c;不是完全独立的。需要相互通信&#xff…

【数据结构OJ题】有效的括号

原题链接&#xff1a;https://leetcode.cn/problems/valid-parentheses/ 目录 1. 题目描述 2. 思路分析 3. 代码实现 1. 题目描述 2. 思路分析 这道题目主要考查了栈的特性&#xff1a; 题目的意思主要是要做到3点匹配&#xff1a;类型、顺序、数量。 题目给的例子是比较…

神经网络基础-神经网络补充概念-02-逻辑回归

概念 逻辑回归是一种用于二分分类问题的统计学习方法&#xff0c;尽管名字中带有"回归"一词&#xff0c;但实际上它用于分类任务。逻辑回归的目标是根据输入特征来预测数据点属于某个类别的概率&#xff0c;然后将概率映射到一个离散的类别标签。 逻辑回归模型的核…

Django实现音乐网站 ⑾

使用Python Django框架制作一个音乐网站&#xff0c; 本篇主要是前端开发前的一些必要配置和首页展示开发。 目录 配置应用路由 创建应用路由文件 应用路径加入项目路径 创建项目模板 创建项目及应用模板路径 设置模板路径 设置静态资源路径 创建静态资源路径 配置静态…

Qt安卓开发经验技巧总结V202308

01&#xff1a;01-05 pro中引入安卓拓展模块 QT androidextras 。pro中指定安卓打包目录 ANDROID_PACKAGE_SOURCE_DIR $$PWD/android 指定引入安卓特定目录比如程序图标、变量、颜色、java代码文件、jar库文件等。 AndroidManifest.xml 每个程序唯一的一个全局配置文件&…

webshell实践,在nginx上实现负载均衡

1、配置多台虚拟机&#xff0c;用作服务器 在不同的虚拟机上安装httpd服务 我采用了三台虚拟机进行服务器设置&#xff1a;192.168.240.11、192.168.240.12、192.168.240.13 [rootnode0-8 /]# yum install httpd -y #使用yum安装httpd服务#开启httpd服务 [rootnode0-8 /]# …

【C#学习笔记】C#特性的继承,封装,多态

文章目录 封装访问修饰符静态类和静态方法静态构造函数 继承继承原则sealed修饰符里氏替换原则继承中的构造函数 多态接口接口的实例化 抽象类和抽象方法抽象类和接口的异同 虚方法同名方法new覆盖的父类方法继承的同名方法 运行时的多态性编译时的多态性 照理继承封装多态应该…

CSS 字体修饰属性

前言 字体修饰属性 属性说明font-family指定文本显示字体font-size设置字体的大小font-weight设置字体的粗细程度font-style设置字体的倾斜样式text-decoration给文本添加装饰线text-indent设置文本的缩进text-align设置文本的对齐方式line-height设置行高color设置文本的颜色…

Shell脚本基础教程

Shell脚本基础教程 Shell参数定义 定义变量 想要定义变量&#xff0c;只需要使用如下命令即可。 variable_namevariable_valuevariable_name表示变量名&#xff0c;variable_value表示变量值。注意&#xff0c;等号与变量名和变量值之间不能有空格。 变量名的命名需要遵循…

C语言入门_Day7 逻辑运算

目录&#xff1a; 前言 1.逻辑运算 2.优先级 3.易错点 4.思维导图 前言 算术运算用来进行数据的计算和处理&#xff1b;比较运算是用来比较不同的数据&#xff0c;进而来决定下一步怎么做&#xff1b;除此以外还有一种运算叫做逻辑运算&#xff0c;它的应用场景也是用来影…

电脑远程接入软件可以进行文件传输吗?快解析内网穿透

电脑远程接入软件的出现&#xff0c;让我们可以在两台电脑之间进行交互和操作。但是&#xff0c;很多人对于这些软件能否进行文件传输还存在一些疑问。下面的文章将解答这个问题。 1.电脑远程接入软件可以进行文件传输。传统上&#xff0c;我们可能会通过传输线或者移动存储设…

Redis在Java中的基本使用

本片将介绍 Redis 在 Java 中的基本使用 文章目录 1、使用jedis操作redis1.1、Jedis简介1.2、引入jedis的Maven依赖1.2、获取连接1.3、使用实例 2、对于JedisPooled的使用2.1、使用JedisPooled2.2、关于连接池 3、SpringBoot下使用Redis3.1、引入Maven依赖3.2、配置Redis连接3.…

RabbitMq:Topic exchange(主题交换机)的理解和使用

RabbitMq:Topic exchange(主题交换机)的理解和使用 在RabbitMq中&#xff0c;生产者的消息都是通过交换机来接收&#xff0c;然后再从交换机分发到不同的队列中去&#xff0c;在分发的过程中交换机类型会影响分发的逻辑&#xff0c;下面主要讲解一下主题交换机。 ​ 主题交换…