2023-08-15 Untiy进阶 C#知识补充6——C#7主要功能与语法
文章目录
- 一、字面值改进
- 二、out 内部声明 / 弃元
- 三、ref 返回值
- 四、本地函数
- 五、抛出表达式
- 六、元组
- 七、模式匹配
注意:在此仅提及 Unity 开发中会用到的一些功能和特性,对于不适合在 Unity 中使用的内容会忽略。
C# 7 对应 Unity 版本:
- Unity 2018.3 支持 C# 7
- Unity 2019.4支持 C# 7.3
7.1、7.2、7.3 相关内容都是基于 C# 7 的一些改进
C# 7 新增功能和语法:
- 字面值改进
- out 内部声明 / 弃元
- ref 返回值
- 本地函数
- 抛出表达式
- 元组
- 模式匹配
一、字面值改进
在声明数值变量时,为了方便查看数值,可以在数值之间插入 “_” 作为分隔符。
主要作用:方便数值变量的阅读。
int i = 9_9123_1239;
print(i); // "991231239"int i2 = 0xAB_CD_17;
print(i2); // "11259159"
二、out 内部声明 / 弃元
不需要再使用带有 out 参数的函数之前,声明对应变量。
作用:简化代码,提高开发效率。
举例:
public class Lesson8 : MonoBehaviour
{public void Calc(out int a, out int b) {a = 10;b = 20;}public void Calc(out float a, out float b) {a = 10;b = 20;}
}
(一)以往 out 使用方式
public class Lesson8 : MonoBehaviour
{void Start() {int a;int b;Calc(out a, out b);}
}
(二)现在的用法
public class Lesson8 : MonoBehaviour
{void Start() {Calc(out int a, out int b);print(x); // "10"print(y); // "20"}
}
可以配合 var 类型使用,但是在函数重载时需要指明哪种类型:
Calc(out var a, out var b); // 报错,不清楚 a、b 是 int 还是 float
Calc(out int a, out var b); // 通过,b 识别为 int
(三)使用弃元符号 “_”
使用 “_” 弃元符号,省略不想使用的参数:
public class Lesson8 : MonoBehaviour
{void Start() {Calc(out int c, out _); // 参数 b 不使用print(c);}
}
三、ref 返回值
使用 ref 修饰临时变量和函数返回值,可以让赋值变为引用传递,即 C++ 中的 & 引用类型。
作用:用于修改数据对象中的某些值类型变量。
(一)引用变量
public struct TestRef
{public int atk;public int def;public TestRef(int atk, int def) {this.atk = atk;this.def = def;}
}public class Lesson8 : MonoBehaviour
{void Start() {int testI = 100;ref int testI2 = ref testI; // testI2 与 testI 指向同一块数据内存testI2 = 900;print(testI); // "900"TestRef r = new TestRef(5, 5);ref TestRef r2 = ref r; // r2 与 r 指向同一个类r2.atk = 10;print(r.atk); // "10"}
}
(二)函数返回值
public class Lesson8 : MonoBehaviour
{// 寻找数组中是否存在 number 成员,并返回其引用// 若找不到,则返回第一个成员的引用public ref int FindNumber(int[] numbers, int number) {for (int i = 0; i < numbers.Length; i++) {if (numbers[i] == number)return ref numbers[i];}return ref numbers[0];}void Start() {int[] numbers = new int[] { 1, 2, 3, 45, 5, 65, 4532, 12 };ref int number = ref FindNumber(numbers, 5); // 获取数组中第 5 个成员的引用number = 98765;print(numbers[4]); // "98765"}
}
四、本地函数
在函数内部可以声明一个临时函数。
注意:
- 本地函数只能在声明该函数的函数内部使用
- 本地函数可以使用声明自己的函数中的变量
作用:方便逻辑的封装
建议:把本地函数写在主要逻辑的后面,方便代码的查看
public int TestTst(int i) {bool b = false;i += 10;Calc(); // 执行本地函数print(b);return i;// 本地函数void Calc() {i += 10;b = true;}
}
五、抛出表达式
抛出表达式,就是指抛出一个错误。一般的使用方式为:throw 后面 new 一个异常类
异常基类:Exception
| 异常类 | 说明 |
|---|---|
| IndexOutOfRangeException | 当一个数组的下标超出范围时运行时引发 |
| NullReferenceException | 当一个空对象被引用时运行时引发 |
| ArgumentException | 方法的参数是非法的 |
| ArgumentNullException | 一个空参数传递给方法,该方法不能接受该参数 |
| ArgumentOutOfRangeException | 参数值超出范围 |
| SystemException | 其他用户可处理的异常的基本类 |
| OutOfMemoryException | 内存空间不够 |
| StackOverflowException | 堆栈溢出 |
| ArithmeticException | 出现算术上溢或者下溢 |
| ArrayTypeMismatchException | 试图在数组中存储错误类型的对象 |
| BadImageFormatException | 图形的格式错误 |
| DivideByZeroException | 除零异常 |
| DllNotFoundException | 找不到引用的 DLL |
| FormatException | 参数格式错误 |
| InvalidCastException | 使用无效的类 |
| InvalidOperationException | 方法的调用时间错误 |
| MethodAccessException | 试图访问思友或者受保护的方法 |
| MissingMemberException | 访问一个无效版本的 DLL |
| NotFiniteNumberException | 对象不是一个有效的成员 |
| NotSupportedException | 调用的方法在类中没有实现 |
| InvalidOperationException | 当对方法的调用对对象的当前状态无效时,由某些方法引发 |
在 C# 7 中,可以在更多的表达式中进行错误抛出。
好处:更节约代码量。
(一)空合并操作符后用 throw
private void InitInfo(string str) => jsonStr = str ?? throw new ArgumentNullException(nameof(str));
(二)三目运算符后面用 throw
private string GetInfo(string str, int index) {string[] strs = str.Split(',');return strs.Length > index ? strs[index] : throw new IndexOutOfRangeException();
}
(三)=> 符号后面直接 throw
Action action = () => throw new Exception("错了,不准用这个委托");
六、元组
多个值的集合,相当于是一种快速构建数据结构类的方式。
在函数存在多返回值时可以使用元组 (返回值 1 类型, 返回值 2 类型, ....) 来声明返回值;
在函数内部返回具体内容时通过 (返回值 1, 返回值 2, ....) 进行返回。
主要作用:提升开发效率,更方便的处理多返回值等需要用到多个值时的需求。
(一)无变量名元组
(int, float, bool, string) yz = (1, 5.5f, true, "123");print(yz.Item1); // "1"
print(yz.Item2); // "5.5"
print(yz.Item3); // "true"
print(yz.Item4); // "123"
(二)有变量名元组
(int i, float f, bool b, string str) yz2 = (1, 5.5f, true, "123");print(yz2.i); // "1"
print(yz2.f); // "5.5"
print(yz2.b); // "true"
print(yz2.str); // "123"
(三)元组的比较
元组可以进行等于和不等于的判断:
- 数量相同才比较;
- 类型相同才比较;
- 每一个参数的比较通过
==比较,都是 true 才认为两个元组相等。
print(yz == yz2); // "true"
(四)成员变量
元组不仅可以作为临时变量,成员变量也是可以的:
public class Lesson9 : MonoBehaviour
{public (int, float) yz;void Start() {print(this.yz.Item1); // "0",未初始化,int 默认值为 0}
}
(五)元组解构
把多返回值元组拆分到不同的变量中:
public class Lesson9 : MonoBehaviour
{private (string str, int i, float f) GetInfo() {return ("123", 2, 5.5f);}void Start() {int myInt;string myStr;float myFloat;(myStr, myInt, myFloat) = GetInfo(); // 解构print(myStr); // "123"print(myInt); // "2"print(myFloat); // "5.5"}
}
可以简化写成:
(string myStr, int myInt, float myFloat) = GetInfo();
亦可以使用弃元:
(string ss, _, _) = GetInfo(); // 不使用参数 i 和 f
print(ss);
字典中键的应用:
Dictionary<(int i, float f), string> dic = new Dictionary<(int i, float f), string>();
dic.Add((1, 2.5f), "123");if (dic.ContainsKey((1, 2.5f))) {print("存在相同的键");print(dic[(1, 2.5f)]);
}
七、模式匹配
模式匹配是一种语法元素,可以测试一个值是否满足某种条件,并可以从值中提取信息。
在 C# 7 中,模式匹配增强了两个现有的语言结构:
- is 表达式:可以在右侧写一个模式语法,而不仅仅是一个类型
- switch 语句中的 case
主要作用:节约代码量,提高编程效率
(一)常量模式
(is 常量)
用于判断输入值是否等于某个值。
object o = 1.5f;if (o is 1) {print("o是1");
}if (o is null) {print("o是null");
}
(二)类型模式
(is 类型 变量名、case 类型 变量名)
用于判断输入值类型,如果类型相同,将输入值提取出来。
判断某一个变量是否是某一个类型,如果满足会将该变量存入你申明的变量中。
以前的写法:
if (o is int) {int i = (int) o;print(i);
}
现在的写法:
if (o is int i) {print(i); // 不打印
}
switch 使用:
switch (o) {case int value:print("int:" + value);break;case float value:print("float:" + value); // "float:1.5"break;case null:print("null");break;default:break;
}
(三)var 模式
用于将输入值放入与输入值相同类型的新变量中,相当于是将变量装入一个和自己类型一样的变量中。
if (o is var v) {print("v:" + v); // "v:1.5"
}
相关文章:
2023-08-15 Untiy进阶 C#知识补充6——C#7主要功能与语法
文章目录 一、字面值改进二、out 内部声明 / 弃元三、ref 返回值四、本地函数五、抛出表达式六、元组七、模式匹配 注意:在此仅提及 Unity 开发中会用到的一些功能和特性,对于不适合在 Unity 中使用的内容会忽略。 C# 7 对应 Unity 版本࿱…...
logstash配置文件
input { kafka { topics > “xxxx” bootstrap_servers > “ip:port” auto_offset_reset > “xxxx” group_id > “xxxx” consumer_threads > 3 codec > “json” } } filter { grok { match > { “message” > ‘%{IP:client_ip} - - [%{HTTPDATE:…...
docker搭建lnmp(nginx+mysql57+php7.4)
docker搭建lnmp(nginxmysql57php7.4) 1. 准备工作 docker安装 $ sudo yum update $ sudo sudo yum install -y yum-utils device-mapper-persistent-data lvm2 $ sudo yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo $ sudo…...
专访 BlockPI:共建账户抽象未来的新一代 RPC 基础设施
在传统 RPC 服务板块上,开发者一直饱受故障风险、运行环境混乱等难题的折磨。实现 RPC 服务的去中心化,且保持成本优势和可扩展性,始终是区块链基础设施建设的重要命题之一。从 2018 年观察中心化 RPC 供应商服务现状开始,BlockPI…...
js fetch请求中断的几种方式
1、通过AbortController 这是官方标准手段,真正意义的阻止请求(不支持ie) 后端接口设置的两秒返回数据 function myFetch() {const controller new AbortController();const signal controller.signal;fetch(http://localhost:3000/aaa/…...
Python自动化实战之使用Selenium进行Web自动化详解
概要 为了完成一项重复的任务,你需要在网站上进行大量的点击和操作,每次都要浪费大量的时间和精力。Python的Selenium库就可以自动化完成这些任务。 在本篇文章中,我们将会介绍如何使用Python的Selenium库进行Web自动化,以及如何…...
“之江数据安全治理论坛”暨《浙江省汽车数据处理活动规定(专家建议稿)》研讨会顺利召开
研讨会主题 8月10日,“之江数据安全治理论坛”暨《浙江省汽车数据处理活动规定(专家建议稿)》研讨会在浙江大学计算机创新技术研究院举办。 本次研讨会的主题聚焦于“智能网联汽车的数据安全与数据合规”,邀请行业主管部门和数据…...
消息中间件面试题
异步发送(验证码、短信、邮件…) MYSQL和Redis,ES之间的数据同步 分布式事务 削峰填谷 RabbitMQ如何保证消息不丢失? 开启生产者确认机制,确保生产者的消息能到达队列 开启持久化功能,确保消息未消费前在队列中不会丢失 开启消费…...
麻辣烫数据可视化,麻辣烫市场将持续蓬勃发展
麻辣烫,这道源自中国的美食,早已成为人们生活中不可或缺的一部分。它独特的香辣口味,让人忍不住每每流连忘返。与人们的关系,简直如同挚友一般。每当寒冷的冬日或疲惫的时刻,麻辣烫总是悄然走进人们的心房,…...
大数据课程J1——Scala的概述
文章作者邮箱:yugongshiye@sina.cn 地址:广东惠州 ▲ 本章节目的 ⚪ 了解Scala的特点; ⚪ 了解Scala的开发环境搭建; ⚪ 了解Scala的开发工具; 一、概述 1.简介 Scala既是面向对象的语言,也是面向函数的语言。scala可以为你在做大量代码重用和扩展是提…...
第二章:25+ Python 数据操作教程(第十三节NUMPY 教程与练习)
NumPy(“Numerical Python”或“Numeric Python”的缩写)是 Python 中对数组和矩阵进行快速数学计算的最基本的软件包之一。在处理多维数据时它也非常有用。集成C、C++和FORTRAN工具是一件幸事。它还提供了许多傅里叶变换 (FT) 和线性代数函数。 为什么使用 NumPy 而不是列…...
【Java面试】如果一个线程两次调用start(),会出现什么问题?
这个问题出自阿里p6岗位第一面的提问,你会回答吗? 在Java里面,一个线程只能调用一次start()方法,第二次调用会抛出IllegalThreadStateException异常。 一个线程本身是具备一个生命周期的。 在Java里面,线程的生命周…...
购买steam余额有风险吗?以及N种被红锁的情况
购买steam余额有风险吗?以及N种被红锁的情况 无论是打游戏的玩家,还是像我们这类靠倒卖装备赚钱的小商贩,都面临充值美金余额的问题,我们现在主要是找的专业充值渠道做代充。 最近我发现群里有极个别学员通过自己的方法找到了一…...
使用 BERT 进行文本分类 (02/3)
一、说明 在使用BERT(1)进行文本分类中,我向您展示了一个BERT如何标记文本的示例。在下面的文章中,让我们更深入地研究是否可以使用 BERT 来预测文本是使用 PyTorch 传达积极还是消极的情绪。首先,我们需要准备数据…...
基于Hadoop的表级监管
现状 大数据平台中,采用hadoop的方式存储数据,hdfs本质上是文件系统,而文件系统对数据的监管能力有限,但是数据安全领域问题日渐凸显,现目前,大数据平台一般以分层结构进行授权,但是对于一线开发人员而言,是能够接触到整个大数据平台中的所有表的,那么如何实现这样一…...
【学习日记】【FreeRTOS】延时列表的实现
前言 本文在前面文章的基础上实现了延时列表,取消了 TCB 中的延时参数。 本文是对野火 RTOS 教程的笔记,融入了笔者的理解,代码大部分来自野火。 一、如何更高效地查找延时到期的任务 1. 朴素方式 在本文之前,我们使用了一种朴…...
LeetCode解法汇总833. 字符串中的查找与替换
目录链接: 力扣编程题-解法汇总_分享记录-CSDN博客 GitHub同步刷题项目: https://github.com/September26/java-algorithms 原题链接:力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台 描述: 你会得到一…...
ide internal errors【bug】
ide internal errors【bug】 前言版权ide internal errors错误产生相关资源解决1解决2 设置虚拟内存最后 前言 2023-8-15 12:36:59 以下内容源自《【bug】》 仅供学习交流使用 版权 禁止其他平台发布时删除以下此话 本文首次发布于CSDN平台 作者是CSDN日星月云 博客主页是h…...
阿里云与中国中医科学院合作,推动中医药行业数字化和智能化发展
据相关媒体消息,阿里云与中国中医科学院的合作旨在推动中医药行业的数字化和智能化发展。随着互联网的进步和相关政策的支持,中医药产业受到了国家的高度关注。这次合作将以“互联网 中医药”为载体,致力于推进中医药文化的传承和创新发展。…...
【Redis】Redis 的学习教程(五)之 SpringBoot 集成 Redis
在前几篇文章中,我们详细介绍了 Redis 的一些功能特性以及主流的 java 客户端 api 使用方法。 在当前流行的微服务以及分布式集群环境下,Redis 的使用场景可以说非常的广泛,能解决集群环境下系统中遇到的不少技术问题,在此列举几…...
51c自动驾驶~合集58
我自己的原文哦~ https://blog.51cto.com/whaosoft/13967107 #CCA-Attention 全局池化局部保留,CCA-Attention为LLM长文本建模带来突破性进展 琶洲实验室、华南理工大学联合推出关键上下文感知注意力机制(CCA-Attention),…...
Java入门学习详细版(一)
大家好,Java 学习是一个系统学习的过程,核心原则就是“理论 实践 坚持”,并且需循序渐进,不可过于着急,本篇文章推出的这份详细入门学习资料将带大家从零基础开始,逐步掌握 Java 的核心概念和编程技能。 …...
听写流程自动化实践,轻量级教育辅助
随着智能教育工具的发展,越来越多的传统学习方式正在被数字化、自动化所优化。听写作为语文、英语等学科中重要的基础训练形式,也迎来了更高效的解决方案。 这是一款轻量但功能强大的听写辅助工具。它是基于本地词库与可选在线语音引擎构建,…...
安宝特方案丨船舶智造的“AR+AI+作业标准化管理解决方案”(装配)
船舶制造装配管理现状:装配工作依赖人工经验,装配工人凭借长期实践积累的操作技巧完成零部件组装。企业通常制定了装配作业指导书,但在实际执行中,工人对指导书的理解和遵循程度参差不齐。 船舶装配过程中的挑战与需求 挑战 (1…...
基于IDIG-GAN的小样本电机轴承故障诊断
目录 🔍 核心问题 一、IDIG-GAN模型原理 1. 整体架构 2. 核心创新点 (1) 梯度归一化(Gradient Normalization) (2) 判别器梯度间隙正则化(Discriminator Gradient Gap Regularization) (3) 自注意力机制(Self-Attention) 3. 完整损失函数 二…...
代码规范和架构【立芯理论一】(2025.06.08)
1、代码规范的目标 代码简洁精炼、美观,可持续性好高效率高复用,可移植性好高内聚,低耦合没有冗余规范性,代码有规可循,可以看出自己当时的思考过程特殊排版,特殊语法,特殊指令,必须…...
Caliper 配置文件解析:fisco-bcos.json
config.yaml 文件 config.yaml 是 Caliper 的主配置文件,通常包含以下内容: test:name: fisco-bcos-test # 测试名称description: Performance test of FISCO-BCOS # 测试描述workers:type: local # 工作进程类型number: 5 # 工作进程数量monitor:type: - docker- pro…...
用鸿蒙HarmonyOS5实现中国象棋小游戏的过程
下面是一个基于鸿蒙OS (HarmonyOS) 的中国象棋小游戏的实现代码。这个实现使用Java语言和鸿蒙的Ability框架。 1. 项目结构 /src/main/java/com/example/chinesechess/├── MainAbilitySlice.java // 主界面逻辑├── ChessView.java // 游戏视图和逻辑├──…...
沙箱虚拟化技术虚拟机容器之间的关系详解
问题 沙箱、虚拟化、容器三者分开一一介绍的话我知道他们各自都是什么东西,但是如果把三者放在一起,它们之间到底什么关系?又有什么联系呢?我不是很明白!!! 就比如说: 沙箱&#…...
C++实现分布式网络通信框架RPC(2)——rpc发布端
有了上篇文章的项目的基本知识的了解,现在我们就开始构建项目。 目录 一、构建工程目录 二、本地服务发布成RPC服务 2.1理解RPC发布 2.2实现 三、Mprpc框架的基础类设计 3.1框架的初始化类 MprpcApplication 代码实现 3.2读取配置文件类 MprpcConfig 代码实现…...
