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 的使用场景可以说非常的广泛,能解决集群环境下系统中遇到的不少技术问题,在此列举几…...
挑战杯推荐项目
“人工智能”创意赛 - 智能艺术创作助手:借助大模型技术,开发能根据用户输入的主题、风格等要求,生成绘画、音乐、文学作品等多种形式艺术创作灵感或初稿的应用,帮助艺术家和创意爱好者激发创意、提高创作效率。 - 个性化梦境…...
Docker 离线安装指南
参考文章 1、确认操作系统类型及内核版本 Docker依赖于Linux内核的一些特性,不同版本的Docker对内核版本有不同要求。例如,Docker 17.06及之后的版本通常需要Linux内核3.10及以上版本,Docker17.09及更高版本对应Linux内核4.9.x及更高版本。…...
3.3.1_1 检错编码(奇偶校验码)
从这节课开始,我们会探讨数据链路层的差错控制功能,差错控制功能的主要目标是要发现并且解决一个帧内部的位错误,我们需要使用特殊的编码技术去发现帧内部的位错误,当我们发现位错误之后,通常来说有两种解决方案。第一…...
centos 7 部署awstats 网站访问检测
一、基础环境准备(两种安装方式都要做) bash # 安装必要依赖 yum install -y httpd perl mod_perl perl-Time-HiRes perl-DateTime systemctl enable httpd # 设置 Apache 开机自启 systemctl start httpd # 启动 Apache二、安装 AWStats࿰…...
ServerTrust 并非唯一
NSURLAuthenticationMethodServerTrust 只是 authenticationMethod 的冰山一角 要理解 NSURLAuthenticationMethodServerTrust, 首先要明白它只是 authenticationMethod 的选项之一, 并非唯一 1 先厘清概念 点说明authenticationMethodURLAuthenticationChallenge.protectionS…...
华为云Flexus+DeepSeek征文|DeepSeek-V3/R1 商用服务开通全流程与本地部署搭建
华为云FlexusDeepSeek征文|DeepSeek-V3/R1 商用服务开通全流程与本地部署搭建 前言 如今大模型其性能出色,华为云 ModelArts Studio_MaaS大模型即服务平台华为云内置了大模型,能助力我们轻松驾驭 DeepSeek-V3/R1,本文中将分享如何…...
Device Mapper 机制
Device Mapper 机制详解 Device Mapper(简称 DM)是 Linux 内核中的一套通用块设备映射框架,为 LVM、加密磁盘、RAID 等提供底层支持。本文将详细介绍 Device Mapper 的原理、实现、内核配置、常用工具、操作测试流程,并配以详细的…...
Python 包管理器 uv 介绍
Python 包管理器 uv 全面介绍 uv 是由 Astral(热门工具 Ruff 的开发者)推出的下一代高性能 Python 包管理器和构建工具,用 Rust 编写。它旨在解决传统工具(如 pip、virtualenv、pip-tools)的性能瓶颈,同时…...
tomcat指定使用的jdk版本
说明 有时候需要对tomcat配置指定的jdk版本号,此时,我们可以通过以下方式进行配置 设置方式 找到tomcat的bin目录中的setclasspath.bat。如果是linux系统则是setclasspath.sh set JAVA_HOMEC:\Program Files\Java\jdk8 set JRE_HOMEC:\Program Files…...
微服务通信安全:深入解析mTLS的原理与实践
🔥「炎码工坊」技术弹药已装填! 点击关注 → 解锁工业级干货【工具实测|项目避坑|源码燃烧指南】 一、引言:微服务时代的通信安全挑战 随着云原生和微服务架构的普及,服务间的通信安全成为系统设计的核心议题。传统的单体架构中&…...
