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#中用于声明静态成员,这些成员在整个应用程序的生命周期中保持不变,无需创建类的实例即可访问。静态成员在全局共享状态、提供工具函数等方面具有重要作用。

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

华为网络篇 RIP的负载均衡-29

难度2复杂度2 目录 一、实验原理 二、实验拓扑 三、实验步骤 四、实验过程 总结 一、实验原理 RIP是使用跳数(经过路由的数量)作为metric值的,当网络上存在去往目标的路由有两条以上都是相同metric时,就出现了流量负载均衡。…

uniapp开发微信小程序使用painter将页面转换为图片并保存到本地相册

引言 我使用到painter的原因是,在uniapp开发微信小程序时,需要将一个页面的内容转换成图片保存到本地相册。 起初在网上找到很多都是在uniapp中使用 html2canvas 将网页转换成图片再jspdf将图片转换为pdf,但是这种方式在小程序环境不支持&am…

使用SSH隧道将Ubuntu云服务器Jupyter Notebook端口映射到本地

本文主要实现了在Ubuntu云服务器后台运行Jupyter Notebook,并使用SSH隧道将服务器端口映射到本地 1. 生成配置文件 运行以下命令生成Jupyter Notebook的配置文件: jupyter notebook --generate-config这将在用户主目录下生成一个名为.jupyter的文件夹&…

excel中有哪些通配符、excel配置问题,数学函数篇1之sum系列

学习excel前需要明确的是事:   在学习excel函数之前,大家需要明确一件事,excel现在设计到了一些新函数,这些新函数只能存在于office365、office2019及更 新版本之中,所以建议大家在学习时安装较新的版本,…

PyMuPDF`库实现PDF旋转功能

本文介绍了一个简单的Python应用程序,用于将PDF文件转换为旋转90度的PDF文件。主要用于csdn网站中导出的博客pdf是横向的,看起来不是很方便,才想到用python编制一个将pdf从横向转为纵向的功能。 功能 该PDF转换工具具有以下功能&#xff1a…

算法通关村第十关 | 快速排序

1.快速排序的基本过程 快速排序是分治法运用到排序问题的典型例子,基本思想是:通过一个标记pivot元素将n个元素的序列划分为左右两个子序列left和right,其中left中的元素都比pivot小,right的都比pivot的大,然后再次对l…

BOXTRADE-天启量化分析平台 系统功能预览

BOXTRADE-天启量化分析平台 系统功能预览 系统功能预览 1.登录 首页 参考登录文档 2. A股 行情与策略分析 2.1 A股股票列表 可以筛选和搜索 2.2 A股行情及策略回测 2.2.1 行情数据提供除权和前复权,后复权数据;外链公司信息 2.2.2 内置策略执行结果…

uniapp选择只选择月份demo效果(整理)

<template><view style"margin-top: 200rpx;"><!-- mode"multiSelector" 多列选择器 --><view><picker :range"years" :value"echoVal" change"yearChange" mode"multiSelector">{…

【排序】插入排序 希尔排序(改进)

文章目录 插入排序时间复杂度空间复杂度 代码希尔排序时间复杂度空间复杂度 代码 以从小到大排序为例进行说明。 插入排序 插入排序就是从前向后&#xff08;i1开始&#xff09;进行选择&#xff0c;如果找到在i之前&#xff08;分配一个j下标进行寻找&#xff09;有比array[i…

【腾讯云 TDSQL-C Serverless产品体验】抓取processon热门模版的标题生成词云

【腾讯云 TDSQL-C Serverless产品体验】抓取processon热门模版的标题生成词云 serverless服务是腾讯云自研的新一代云原生关系型数据库TDSQ L-C的无服务器架构版&#xff0c;是全Serverless架构的云原生数据库 前言 体验了一下腾讯云刚出的TDSQL-C Serverless&#xff0c;使用…

React快速入门

最近需要学到react&#xff0c;这里进行一个快速的入门&#xff0c;参考react官网 1.创建和嵌套组件 react的组件封装是个思想&#xff0c;我这里快速演示代码&#xff0c;自己本身也不太熟悉。 代码的路径是src底下的App.js function MyButton() {return (<button>I…

GAN!生成对抗网络GAN全维度介绍与实战

目录 一、引言1.1 生成对抗网络简介1.2 应用领域概览1.3 GAN的重要性 二、理论基础2.1 生成对抗网络的工作原理2.1.1 生成器生成过程 2.1.2 判别器判别过程 2.1.3 训练过程训练代码示例 2.1.4 平衡与收敛 2.2 数学背景2.2.1 损失函数生成器损失判别器损失 2.2.2 优化方法优化代…

git错误记录

露id没有影响&#xff0c;搞得微软不知道我ip一样 git fatal: 拒绝合并无关的历史的错误解决(亲测有效)

Vue elementui 实现表格selection的默认勾选,翻页记录勾选状态

需求&#xff1a;当弹出一个列表页数据&#xff0c;对其进行筛选选择。 列表更新&#xff0c;填充已选数据 主要使用toggleRowSelection 代码如下&#xff1a; <el-table v-loading"loading" :data"drugList" selection-change"handleSelection…

非常适合大学附近的校园跑腿和自习室订座小程序

推荐两款非常适合在大学内和大学周边的项目 这两款小程序分别是校园跑腿系统和自习室在线订座系统 1、校园跑腿系统&#xff0c;第一张图所示&#xff0c;支持多校运营、快递代取、校园跑腿、租借服务、代理中心、跑腿中心、人员管理、订单抽成、数据统计、众包接单、消息通…

软考A计划-系统集成项目管理工程师-法律法规-上

点击跳转专栏>Unity3D特效百例点击跳转专栏>案例项目实战源码点击跳转专栏>游戏脚本-辅助自动化点击跳转专栏>Android控件全解手册点击跳转专栏>Scratch编程案例点击跳转>软考全系列点击跳转>蓝桥系列 &#x1f449;关于作者 专注于Android/Unity和各种游…

春秋云镜 CVE-2020-13933

春秋云镜 CVE-2020-13933 Shiro < 1.6.0 验证绕过漏洞 靶标介绍 Apahce Shiro 由于处理身份验证请求时出错 存在 权限绕过漏洞&#xff0c;远程攻击者可以发送特制的HTTP请求&#xff0c;绕过身份验证过程并获得对应用程序的未授权访问。 启动场景 漏洞利用 exp /admin…

区块链碎碎念

现在的区块链早已过了跑马圈地的时代&#xff0c;现在还按照以前承接项目的方式做区块链只能是越来越艰难。经过几年的技术沉淀&#xff0c;做区块链项目的公司都已经没落的七七八八了。 区块链不是一个能够快速显现盈利能力的行业&#xff0c;相反这个行业目前的模式还是处于…

对话音视频牛哥:开发RTSP|RTMP直播播放器难不难?难在哪?

我关注的播放器指标 好多开发者跟我交流音视频相关技术的时候&#xff0c;经常问我的问题是&#xff0c;多久可以开发个商业级别的RTMP或RTSP播放器&#xff1f;你们是怎样做到毫秒级延迟的&#xff1f;为什么一个播放器&#xff0c;会被你们做到那么复杂&#xff1f;带着这些…

使用 HTML、CSS 和 JavaScript 创建实时 Web 编辑器

使用 HTML、CSS 和 JavaScript 创建实时 Web 编辑器 在本文中&#xff0c;我们将创建一个实时网页编辑器。这是一个 Web 应用程序&#xff0c;允许我们在网页上编写 HTML、CSS 和 JavaScript 代码并实时查看结果。这是学习 Web 开发和测试代码片段的绝佳工具。我们将使用ifram…