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.mzph.cn/news/48100.shtml

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

相关文章

构造函数内的方法 直接写在构造函数内部 与 写在prototype上 的区别

文章目录 前言区别总结 前言 以前没注意过, 去创建一个构造函数的时候, 方法都是直接写在函数内的. 在构造函数需要多次实例化的情况下有缺点, 不过幸好以前项目里的构造函数也不需要多次实例化, 缺点没有生效. 区别 为了比较, 先在构造函数内部直接书写方法, 查看实例化结果…

EasyExcel工具 Java导出Excel表数据

EasyExcel 优点坐标依赖读Excel最简单的读的对象写Excel最简单的写的对象最简单的读的监听器填充Excel简单填充(对象)复杂填充(对象和列表)官网:https://easyexcel.opensource.alibaba.com/ EasyExcel是一个基于Java的、快速、简洁、解决大文件内存溢出的Excel处理工具。…

使用ChatGPT进行创意写作的缺点

Open AI警告ChatGPT的使用者要明白此工具的局限性,更不应完全依赖。作为一位创作者,这一点非常重要,应尽可能地避免让版权问题或不必要的文体问题出现在自己的作品中。[1] 毕竟使用ChatGPT进行创意写作目前还有以下种种局限或缺点[2]&#xf…

Nginx高可用集群

目录 一.简介二.案例1.实现思路2.配置文件修改3.实现效果故障转移机制 一.简介 以提高应用系统的可靠性,尽可能地减少中断时间为目标,确保服务的连续性,达到高可用的容错效果。例如“故障切换”、“双机热备”、“多机热备”等都属于高可用集…

蓝凌OA custom.jsp 任意文件读取

​曾子曰:“慎终追远,民德归厚矣。” 漏洞复现 访问漏洞url: 出现漏洞的文件为 custom.jsp,构造payload: /sys/ui/extend/varkind/custom.jsp var{"body":{"file":"file:///etc/passwd&q…

圆的反演 hdu 6097

欢迎关注更多精彩 关注我,学习常用算法与数据结构,一题多解,降维打击。 题目大意 http://acm.hdu.edu.cn/showproblem.php?pid6097 有一个圆C,它的圆心是O(0,0), 半径是r。 在C内部或边界上有两点P和Q,OPOQ。 求解…

软考高级架构师下篇-12层次式架构设计理论与实践

目录 1. 考情分析2. 层次式体系结构概述3. 表现层框架设计4. 中间层框架设计5. 数据访问层设计6. 数据架构规划与设计7. 物联网层次架构设计8. 前文回顾1. 考情分析 根据考试大纲,层次式架构设计理论与实践知识点会涉及单选题型(约占2~5分)和案例题(25分),本小时内容偏重于方…

三分钟解决AE缓存预览渲染错误、暂停、卡顿问题

一、清除RAM缓存(内存) 你应该做的第一件事是清除你的RAM。这将清除当前存储在内存中的所有临时缓存文件。要执行此操作,请导航到编辑>清除>所有内存。这将从头开始重置RAM缓存 二、清空磁盘缓存 您也可以尝试清空磁盘缓存。执行此操作…

实现chatGPT 聊天样式

效果图 代码&#xff1a; <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>Chat Example</title&g…

第6天----【位运算进阶之-----位与()】七夕特别版

今天我们来学习C语言的位与。 ❤️C语言的位与&#xff08;&&#xff09;操作是一种按位运算符&#xff0c;用于对两个操作数的每个对应位执行逻辑与操作。它的操作规则如下&#xff1a; 如果两个操作数的对应位都为1&#xff0c;则结果的对应位也为1。&#xff08;全1才…

【Cadence】差分管噪声贡献差别很大的可能原因

举例&#xff1a;M2 M3是一对差分管&#xff0c;噪声贡献差别很大。 理想电感下二者贡献相同&#xff0c; 但在实际电磁仿真后&#xff0c;一个17.6%&#xff0c;一个5.6% 原因是&#xff1a; 电磁仿真存在交叉&#xff0c;不对称&#xff0c;中心抽头不是理想的交流地&#x…

初识C语言

目录 一、C语言的概念 二、第一个C语言程序 三、数据类型 四、变量和常量 4.1 变量定义方法 4.2 变量的命名 4.3 变量的分类 4.4 变量的作用域和生命周期 4.5 常量 五、字符串和转义字符 5.1 字符串 5.2 转义字符 六、注释 七、选择语句 八、循环语句 九、函数 十、数…

如何使用CSS实现一个全屏滚动效果(Fullpage Scroll)?

聚沙成塔每天进步一点点 ⭐ 专栏简介⭐ 实现全屏滚动效果的CSS和JavaScript示例⭐ HTML 结构⭐ CSS 样式 (styles.css)⭐ JavaScript 代码 (script.js)⭐ 实现说明⭐ 写在最后 ⭐ 专栏简介 前端入门之旅&#xff1a;探索Web开发的奇妙世界 记得点击上方或者右侧链接订阅本专栏哦…

node_modules.cache是什么东西

一开始没明白这是啥玩意&#xff0c;还以为是npm的属性&#xff0c;网上也没说过具体的来源出处 .cache文件的产生是由webpack4的插件cache-loader生成的&#xff0c;node_modules里下载了cache-loader插件&#xff0c;很多朋友都是vuecli工具生成的项目&#xff0c;内置了这部…

以创新点亮前路,戴尔科技开辟数实融合新格局

编辑&#xff1a;阿冒 设计&#xff1a;沐由 2023年&#xff0c;对于戴尔科技而言是特殊的一年&#xff0c;这是戴尔科技进入中国市场第25个年头——“巧合”的是&#xff0c;这25年也是中国产业经济发展最快&#xff0c;人们工作与生活发生变化最大的四分之一个世纪。 2023年&…

mysql全文检索使用

数据库数据量10万左右&#xff0c;使用like %test%要耗费30秒左右&#xff0c;放弃该办法 使用mysql的全文检索 第一步:建立索引 首先修改一下设置: my.ini中ngram_token_size 1 可以通过 show variables like %token%;来查看 接下来建立索引:alter table 表名 add f…

.Net程序调试时接受外部命令行参数方式

1.对项目右键&#xff0c;属性 2.在调试中打开常规&#xff0c;打开调试启动配置文件UI 3.输入需要的命令行参数

idea 左下角的Git(Version Control)中显示Local Changes窗口

打开Local Changes窗口来查看当前Git仓库的本地变更。 使用快捷键: - Windows: Alt9 - Mac: Cmd9 解决&#xff1a; &#xff08;1&#xff09;idea打开settings &#xff08;2&#xff09;点击Version Control窗口选项卡&#xff0c;选择Commit选项&#xff0c;对 Use.... in…

springBoot防止重复提交

自定义注解AOPRedis 自定义注解 package com.wzw.config.anno;import java.lang.annotation.*;/*** 自定义注解防止表单重复提交*/ Target(ElementType.METHOD) // 注解只能用于方法 Retention(RetentionPolicy.RUNTIME) // 修饰注解的生命周期 Documented public interface …

【微服务学习笔记】认识微服务

【微服务学习笔记】认识微服务 单体架构 分布式架构 微服务架构 SpringCloud 服务拆分和注意事项 服务拆分的案例demo 各个服务之间的数据库都是相互独立的&#xff0c;你不能直接访问对方的数据库&#xff0c;只能从一个服务像另外一个服务发起远程调用 在订单模块的服务中 …