当前位置: 首页 > news >正文

2023-08-17 Untiy进阶 C#知识补充7——C#8主要功能与语法

文章目录

        • 一、Using 声明
        • 二、静态本地函数
        • 三、Null 合并赋值
        • 四、解构函数 Deconstruct
        • 五、模式匹配增强功能

​ 注意:在此仅提及 Unity 开发中会用到的一些功能和特性,对于不适合在 Unity 中使用的内容会忽略。

​ C# 8 对应 Unity 版本:

  • Unity 2020.3 —— C# 8

​ 但是部分新内容还不在该版本 Unity 中被支持,下面筛选了一些比较实用的内容。

​ C# 8 新增功能和语法:

  1. Using 声明
  2. 静态本地函数
  3. Null 合并赋值
  4. 解构函数 Deconstruct
  5. 模式匹配增强功能

一、Using 声明

​ Using 声明是对 using 语法的简写,当函数执行完毕时会调用对象的 Dispose 方法来释放对象。

public class Lesson10 : MonoBehaviour
{void Start() {using StreamWriter s2 = new StreamWriter("文件路径");// 对该对象进行逻辑操作s2.Write(5);s2.Flush();s2.Close();// 利用这个写法 就会在上层语句块执行结束时释放该对象}
}

​ 注意:在使用 using 语法时,声明的对象必须继承 System.IDisposable 接口:

public class TestUsing : IDisposable
{public void Dispose() { }
}public class Lesson10 : MonoBehaviour
{void Start() {using TestUsing t = new TestUsing();}
}

​ 因为必须具备 Dispose 方法,所以当声明没有继承该接口的对象时会报错.

二、静态本地函数

​ 静态本地函数就是在本地函数前方加入静态关键字。

​ 作用:让本地函数不能够使用访问封闭范围内(也就是上层方法中)的任何变量,让本地函数只能处理逻辑,避免让它通过直接改变上层变量来处理逻辑造成逻辑混乱。

public int TestTst(int i) {bool b = false;i += 10;Calc(ref i, ref b); // 执行静态本地函数return i;// 静态本地函数static void Calc(ref int i, ref bool b) {i += 10;b =  true;}
}

三、Null 合并赋值

​ 空合并赋值是 C# 8.0 新加的一个运算符 ??=,类似复合运算符:
左边值 ??= 右边值
​ 当左侧为空时才会把右侧值赋值给变量。
​ 举例:

string str  = null;
str ??= "4565";
print(str); // "4565"// 注意:由于左侧为空才会讲右侧赋值给变量,所以不为空的变量不会改变
str ??= "1111";
print(str); // "4565"

四、解构函数 Deconstruct

​ 我们可以在自定义类当中声明解构函数,这样我们可以将该自定义类对象利用元组的写法对其进行变量的获取。
​ 语法:在类的内部声明函数:

public void Deconstruct(out 变量类型 变量名, out 变量类型 变量名.....)
​ 特点:一个类中可以有多个 Deconstruct,但是参数数量不能相同。

public class Person
{public string name;public bool   sex;public string number;public string email;// 三个解构函数public void Deconstruct(out string n, out bool sex) {n   = name;sex = this.sex;}public void Deconstruct(out string n, out bool sex, out string number) {n      = name;sex    = this.sex;number = this.number;}public void Deconstruct(out string n, out bool sex, out string number, out string email) {n      = name;sex    = this.sex;number = this.number;email  = this.email;}
}public class Lesson10 : MonoBehaviour
{void Start() {// 初始化并赋值Person p = new Person();p.name   = "xxx";p.sex    = false;p.number = "123123123123";p.email  = "xxxxxxxx@163.com";// 对该对象利用元组将其具体的变量值解构出来// 相当于把不同的成员变量拆分到不同的临时变量中(string name, bool sex) = p;print(name); // "xxx"print(sex);  // "false"string str3;(_, _, str3) = p;print(str3); // "123123123123"}
}

​ 解构函数也可以简写成:

public void Deconstruct(out string n, out bool sex) => (n, sex) = (this.name, this.sex);public void Deconstruct(out string n, out bool sex, out string number) => (n, sex, number) = (this.name, this.sex, this.number);public void Deconstruct(out string n, out bool sex, out string number, out string email) => (n, sex, number, email) = (this.name, this.sex, this.number, this.email);

五、模式匹配增强功能

​ C# 7 中模式匹配已经有常量模式、类型模式和 var 模式三种,在 C# 8 中新加入了如下几种模式:

  • switch 表达式
  • 属性模式
  • 元组模式
  • 位置模式

(一)switch 表达式

​ 对于如下枚举:

public enum PosType
{Top_Left,Top_Right,Bottom_Left,Bottom_Right,
}

​ 当需要写一个函数获取对应位置时,使用 switch 写法如下:

public Vector2 GetPos(PosType type) {switch (type) {case PosType.Top_Left:return new Vector2(0, 0);case PosType.Top_Right:return new Vector2(1, 0);case PosType.Bottom_Left:return new Vector2(0, 1);case PosType.Bottom_Right:return new Vector2(1, 1);default:return new Vector2(0, 0);}
}

​ switch 表达式是对有返回值的 switch 语句的缩写:

  • => 表达式符号代替 case: 组合
  • _ 弃元符号代替 default:

​ 它的使用限制,主要是用于 switch 语句当中只有一句代码用于返回值时使用:

public Vector2 GetPos(PosType type) => type switch {PosType.Top_Left     => new Vector2(0, 0),PosType.Top_Right    => new Vector2(1, 0),PosType.Bottom_Left  => new Vector2(0, 1),PosType.Bottom_Right => new Vector2(1, 1),_                    => new Vector2(0, 0)
};

(二)属性模式

​ 即在常量模式的基础上判断对象上各属性。
​ 用法:变量 is {属性:值, 属性:值}

​ 对于如下折扣类:

public class DiscountInfo
{public string discount;public bool   isDiscount;public DiscountInfo(string discount, bool isDiscount) {this.discount   = discount;this.isDiscount = isDiscount;}public void Deconstruct(out string dis, out bool isDis) {dis   = this.discount;isDis = this.isDiscount;}
}

​ 如果需要判断其具体信息,需要获取其两个成员变量的值进行判断:

DiscountInfo info = new DiscountInfo("5折", true);if( info.discount == "6折" && info.isDiscount)print("信息相同");

​ 使用属性模式可以快捷判断:

if (info is { discount: "6折", isDiscount: true })print("信息相同");

​ 结合 switch 表达式:

public float GetMoney(DiscountInfo info, float money) => info switch {// 属性模式结合 switch 表达式判断 n 个条件是否满足{ discount: "5折", isDiscount: true } => money * .5f,{ discount: "6折", isDiscount: true } => money * .6f,{ discount: "7折", isDiscount: true } => money * .7f,_                                    => money
};

(三)元组模式

​ 元组模式可以不需要声明数据结构类,可以直接利用元组进行判断:

int  ii = 10;
bool bb = true;if ((ii, bb) is (11, true)) {print("元组的值相同");
}public float GetMoney(string discount, bool isDiscount, float money) => (discount, isDiscount) switch {("5折", true) => money * .5f,("6折", true) => money * .6f,("7折", true) => money * .7f,_            => money
};

(四)位置模式

​ 如果自定义类中实现了解构函数,那么可以直接用对应类对象与元组进行 is 判断:

if (info is ("5折", true)) {print("位置模式 满足条件");
}

​ 同时还可以配合 when 关键字进行逻辑处理:

public float GetMoney2(DiscountInfo info, float money) => info switch {("5折", true) when money > 100 => money * .5f,("6折", true)                  => money * .6f,("7折", true)                  => money * .7f,_                             => money
};

相关文章:

2023-08-17 Untiy进阶 C#知识补充7——C#8主要功能与语法

文章目录 一、Using 声明二、静态本地函数三、Null 合并赋值四、解构函数 Deconstruct五、模式匹配增强功能 ​ 注意:在此仅提及 Unity 开发中会用到的一些功能和特性,对于不适合在 Unity 中使用的内容会忽略。 ​ C# 8 对应 Unity 版本: Un…...

登陆接口的的Filter过滤

目录 一、概述 二、基本操作 三、登陆检查接口 一、概述 什么是Filter? Filter表示过滤器,是 JavaWeb三大组件(Servlet、Filter、Listener)之一。 过滤器可以把对资源的请求拦截下来,从而实现一些特殊的功能 使用了过滤器之后&#xff0…...

【Python原创设计】基于Python Flask的全国气象数据采集及可视化系统-附下载方式以及项目参考论文,原创项目其他均为抄袭

基于Python Flask的全国气象数据采集及可视化系统 一、项目简介二、项目技术三、项目功能四、运行截图五、分类说明六、实现代码七、数据库结构八、源码下载 一、项目简介 本项目是一个基于Web技术的实时气象数据可视化系统。通过爬取中国天气网的各个城市气象数据&#xff0c…...

【力扣】42. 接雨水 <模拟、双指针、单调栈>

【力扣】42. 接雨水 给定 n 个非负整数表示每个宽度为 1 的柱子的高度图,计算按此排列的柱子,下雨之后能接多少雨水。 目录 【力扣】42. 接雨水题解暴力双指针单调栈 示例 1: 输入:height [0,1,0,2,1,0,1,3,2,1,2,1] 输出&…...

【leetcode 力扣刷题】链表基础知识 基础操作

链表基础知识 基础操作 链表基础操作链表基础知识插入节点删除节点查找节点 707. 设计链表实现:单向链表:实现:双向链表 链表基础操作 链表基础知识 在数据结构的学习过程中,我们知道线性表【一种数据组织、在内存中存储的形式】…...

关于openfeign调用时content-type的问题

问题1描述: 今天在A服务使用openfeign调用B服务的时候,发现经常会偶发性报错。错误如下: 情况为偶发,很让人头疼。 两个接口如下: A服务接口: delayReasonApi.test(student);就是使用openfeign调用B服务的…...

OpenCV 玩转图像和视频

为什么学OpenCV? • OpenCV ⽀持对图像缩放、旋转、绘制⽂字图形等基础操作 • OpenCV 库包含了很多计算机视觉领域常⻅算法:⽬标检测、⽬标跟踪等 OpenCV 简介 • OpenCV (Open Source Computer Vision) 是计算机视觉和机器学习软件库 • Intel 1999…...

技术分享 | 如何编写同时兼容 Vue2 和 Vue3 的代码?

LigaAI 的评论编辑器、附件展示以及富文本编辑器都支持在 Vue2(Web)与 Vue3(VSCode、lDEA)中使用。这样不仅可以在不同 Vue 版本的工程中间共享代码,还能为后续升级 Vue3 减少一定阻碍。 那么,同时兼容 Vue…...

基于ArcGis提取道路中心线

基于ArcGis提取道路中心线 文章目录 基于ArcGis提取道路中心线前言一、生成缓冲区二、导出栅格数据三、导入栅格数据四、新建中心线要素五、生成中心线总结 前言 最近遇到一个问题,根据道路SHP数据生成模型的时候由于下载的道路数据杂项数据很多,所以导…...

xcode14.3更新一系列问题

1. Missing file libarclite_iphoneos.a (Xcode 14.3) 解决方法 Xcode升级到14.3后编译失败,完整错误日志: File not found: /Applications/Xcode-beta.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/lib/arc/libarclite_iphoneo…...

1U和2U的服务器怎么选择

企业建设网站的过程中,离不开租用服务器的环节,服务器在多种场景里面都可以发挥作用,服务器租用渠道有哪些?1U、2U选哪种服务器比较好?大家跟着壹基比小鑫一起来了解具体内容吧! 1U、2U选哪种服务器比较好&…...

【SA8295P 源码分析】05 - SA8295P QNX Host 上电开机过程 进一步梳理(结合代码)

【SA8295P 源码分析】05 - SA8295P QNX Host 上电开机过程 进一步梳理(结合代码) 一、APPS PBL(Application Primary Boot Loader):固化在CPU ROM中1.1 APPS PBL 加载 XBL Loader1.2 XBL Loader加载验证并运行SMSS进行自检,自检完成后触发Warm Reset1.3 WarmRest后,APPS…...

【数据结构与算法】迪杰斯特拉算法

迪杰斯特拉算法 介绍 迪杰斯特拉(Dijkstra)算法是典型最短路径算法,用于计算一个节点到其他节点的最短路径。它的主要特点是以中心向外层层扩展(广度优先搜索思想),直到扩展到终点为止。 算法过程 设置…...

python爬虫-网页数据提取

import requests #headers 网页右键->Network->最下面的User-Agent复制。 headers {"user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/116.0.0.0 Safari/537.36"} #你想要的网址 url &q…...

ZigBee的Many-to-One和Source Routing

1. Many-to-One Routing Many-to-One Routing,是一种简单的路由机制,使得整个网络中的路由设备拥有回到中心节点的路由。 在这种机制下,中心节点周期性发送Many-to-One route discovery广播(协议栈默认设置为60s,可以…...

七夕节 Chinese Valentine‘s Day 的由来

农历七月初七是七夕节。Qixi Festival falls on the seventh day of the seventh lunar month. 以前有一个牛郎,和他的哥哥和嫂子住在一起。他放的一头牛曾经是天庭的一个神仙,但他违反天庭的戒律,变成牛放到了人间。As the story goes,once …...

掌握JDK21全新结构化并发编程,轻松提升开发效率!

1 概要 通过引入结构化并发编程的API,简化并发编程。结构化并发将在不同线程中运行的相关任务组视为单个工作单元,从而简化错误处理和取消操作,提高可靠性,并增强可观察性。这是一个预览版的API。 2 历史 结构化并发是由JEP 42…...

【SA8295P 源码分析】00 - 系列文章链接汇总 - 持续更新中

【SA8295P 源码分析】00 - 系列文章链接汇总 - 持续更新中 一、分区、下载、GPIO等杂项相关二、开机启动流程代码分析二、OpenWFD 显示屏模块三、Touch Panel 触摸屏模块四、QUPv3 及 QNX Host透传配置五、Camera 摄像头模块(当前正在更新中...)六、网络…...

TCP拥塞控制详解 | 6. 主动队列管理

网络传输问题本质上是对网络资源的共享和复用问题,因此拥塞控制是网络工程领域的核心问题之一,并且随着互联网和数据中心流量的爆炸式增长,相关算法和机制出现了很多创新,本系列是免费电子书《TCP Congestion Control: A Systems …...

前端学习清单

顺序不分先后。 技术名称技术描述技术链接HTML5HTML5是下一代的HTML标准,是一种用于结构化内容的标记语言。MDN|HTMLCSS3CSS3是CSS技术的升级版本,它的最大好处就是可以让网页设计师更加方便的为网页添加各种各样的样式,而不用再局限于文字、…...

go atomic原子操作详细解读

文章目录 概要1、基本知识1.1 原子操作是什么1.2 CPU怎么实现原子操作的? 2、atomic包2.1、 Add函数2.2、CompareAndSwap函数2.3、Swap函数2.4、Load函数2.5、Store函数 3、atomic.Value值 概要 atomic包是golang通过对底层系统支持的原子操作进行封装,…...

Vue用JSEncrypt对长文本json加密以及发现解密失败

哈喽 大家好啊,最近发现进行加密后 超长文本后端解密失败,经过看其他博主修改 JSEncrypt原生代码如下: // 分段加密,支持中文JSEncrypt.prototype.encryptUnicodeLong function (string) {var k this.getKey();//根据key所能编…...

Excel/PowerPoint折线图从Y轴开始(两侧不留空隙)

默认Excel/PowerPoint折线图是这个样子的: 左右两侧都留了大块空白,很难看 解决方案 点击横坐标,双击,然后按下图顺序点击 效果...

C++的类成员对齐

这是个小语法点,之前我们的对齐方式都是使用#pragma pack,这个方式实际是依赖编译器,且粒度粗(如果#pragma pack(1)之后没有#pragma pack(),那就作用整个进程了)。在C11之后引入关键字alignas,以此来实现对齐更加便利,…...

敏感挂载userhelper容器逃逸复现

目录 前言 分析 实验 前言 分析 实验 # Creates a payload cat "#!/bin/sh" > /evil-helper cat "ps > /output" >> /evil-helper chmod x /evil-helper # Finds path of OverlayFS mount for container # Unless the configuration ex…...

深度解读Promise.prototype.finally

由一个问题引发的血案: 手写源码实现Promise.prototype.finally。 我们知道,对于promise来讲,当状态敲定,无论状态兑现或拒绝时都需要调用的函数,可以使用Promise.prototype.finally的回调来实现。那么如何手写实现Pro…...

如何实现24/7客户服务自动化?建设智能客服知识库

客户自助服务是指用户通过企业或者第三方建立的网络平台或者终端,实现相关的自定义处理。实现客户服务自动化,对提高客户满意度、维持客户关系至关重要。客户服务自动化可以帮助企业以更快的速度和更高的效率来满足客户的售后服务要求,以进一…...

和鲸 ModelWhale 与中科可控多款服务器完成适配认证,赋能中国云生态

当前世界正处于新一轮技术革命及传统产业数字化转型的关键期,云计算作为重要的技术底座,其产业发展与产业规模对我国数字经济的高质量运行有着不可取代的推动作用。而随着我国数字上云、企业上云加快进入常规化阶段,云计算承载的业务应用越来…...

selenium +Jmeter 的性能测试

通过Jmeter快速将已有的Selenium 代码以性能测试的方式组织起来,并使用JMeter 丰富的报表展示测试结果 from selenium import webdriver from selenium.webdriver.common.action_chains import ActionChains from selenium.webdriver.common.by import By driver …...

探索高效的HTTP异步接口测试方法:从轮询等待到自动化方案

本文将深入探讨HTTP异步接口测试的多个方面,包括轮询等待、性能测试以及自动化方案。通过详细的解释和实际案例,帮助您了解如何有效地测试异步接口,确保系统的稳定性和性能。 在现代软件开发中,HTTP异步接口扮演着至关重要的角色&…...

服务周到的做网站/每日英语新闻

各种排序方法代码学习了各种排序方法后,为加强记忆,在此重新复习一遍。1----直接插入排序直接插入排序为稳定的排序方法,原理是将一个记录插入到已经排序号的有序表中,从而得到一个新的,记录数增1的有序表。算法&#…...

南昌网站seo外包/网店培训

🎠🔮导语: 好玩又考验智力的小游戏来了~每天上班上学之后太累就做个小游戏犒劳一下自己吧!这期就是用python做迷宫小游戏分享给大家让我们愉快地开始吧~🎠想领取更多完整源码或Python学习资料可点击这行蓝色字体 &…...

一个ip地址上可以做几个网站/360站长平台链接提交

最近抖音上流行用程序去和喜欢的小姐姐表白,所以,我也用python做了一个这样的图形化界面的小程序。 Github:gitgithub.com:wangqujie/xjj.git 准备工作: 1、首先确定自己的电脑上安装了python3,如未安装,请…...

做网站+利润/百度推广关键词排名规则

在控件的KeyPress事件中编写如下代码: if (e.KeyChar (char)13) {e.Handled true;SendKeys.Send("{TAB}"); }转载于:https://www.cnblogs.com/swtseaman/archive/2011/05/05/2037184.html...

长春集团网站建设/北京seo相关

基于注意力(Attention)机制的端到端系统,又被称为LAS端到端构架。 [6] W. Chan, N. Jaitly, Q. Le, O. Vinyals. Listen, Attend and Spell: A Neural Network for Large Vocabulary Conversational Speech Recognition. ICASSP 2016. 来自 &…...

珠海网站建设的公司/百度应用市场

页目录切换 在任务切换时,通过改变cr3的值来切换页目录,从而改变地址映射关系。 这就是分页的妙处。 由于分页机制的存在,程序使用的都是线性地址空间,而不再是直接的物理地址。 这好像操作系统为应用程序提供了一个不依赖于硬…...