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

C# 8.0 新语法的学习和使用

        C# 8.0 是微软在 2019 年 9 月 23 日随 .NET Core 3.0 一同发布的一个重要版本更新,带来了许多新的语言特性和改进。本文将详细介绍 C# 8.0 的新语法,并通过实际应用案例展示这些新特性的使用方法。

目录

1. 可空引用类型 

2. 异步流 

3. 默认接口方法

4. 模式匹配增强 

5. 索引和范围 

6. 只读成员 

7. Switch 表达式

8. 空合并赋值 (Null-Coalescing Assignment)


1. 可空引用类型 

        C# 8.0 引入了可空引用类型,以减少因 null 引用导致的异常。这项功能通过静态分析,可以帮助我们识别和修复潜在的 NullReferenceException 问题。

        

#nullable enablepublic class Person
{public string Name { get; set; }public string? Address { get; set; }
}public void Example()
{Person person = new Person { Name = "John" };Console.WriteLine(person.Name.Length); // 安全访问Console.WriteLine(person.Address?.Length); // 安全访问,可为空
}

在上述代码中,Name 是非空的引用类型,编译器会确保在任何情况下 Name 都不会为 null。而 Address 则是可空的引用类型,使用时需要进行 null 检查。

2. 异步流 

异步流通过引入 IAsyncEnumerable<T> 接口,使得我们可以在异步方法中使用 yield return 来生成异步流,方便地处理异步数据流。

public async IAsyncEnumerable<int> GenerateNumbersAsync()
{for (int i = 0; i < 10; i++){await Task.Delay(1000);yield return i;}
}public async Task ConsumeAsync()
{await foreach (var number in GenerateNumbersAsync()){Console.WriteLine(number);}
}

在这个例子中,GenerateNumbersAsync 方法异步生成一个整数流,ConsumeAsync 方法异步消费这个流。

3. 默认接口方法

默认接口方法允许在接口中提供方法的默认实现,使得接口的扩展更加容易而不破坏现有实现。

public interface ILogger
{void Log(string message);void LogError(string message){Log($"Error: {message}");}
}public class ConsoleLogger : ILogger
{public void Log(string message){Console.WriteLine(message);}
}public class Program
{public static void Main(){ILogger logger = new ConsoleLogger();logger.Log("This is a log message.");logger.LogError("This is an error message.");}
}
4. 模式匹配增强 

C# 8.0 增强了模式匹配功能,引入了 switch 表达式、位置模式和属性模式,使得代码更加简洁和可读。

public static string DescribeShape(object shape) => shape switch
{Circle c => $"Circle with radius {c.Radius}",Rectangle r => $"Rectangle with width {r.Width} and height {r.Height}",_ => "Unknown shape"
};public class Circle
{public double Radius { get; set; }
}public class Rectangle
{public double Width { get; set; }public double Height { get; set; }
}public static void Main()
{object shape = new Circle { Radius = 5 };Console.WriteLine(DescribeShape(shape)); // 输出 "Circle with radius 5"
}
5. 索引和范围 

新的索引和范围语法使得操作数组和集合更加简洁和直观。

public static void Main()
{int[] numbers = { 1, 2, 3, 4, 5 };Console.WriteLine(numbers[^1]); // 输出 5,获取最后一个元素var subArray = numbers[1..4]; // 获取子数组,从索引1到索引4(不包括4)foreach (var number in subArray){Console.WriteLine(number); // 输出 2, 3, 4}
}
6. 只读成员 

在结构体中声明只读成员,可以确保这些成员不会修改结构体的状态。

public struct Point
{public int X { get; }public int Y { get; }public Point(int x, int y){X = x;Y = y;}public readonly double Distance => Math.Sqrt(X * X + Y * Y);
}public static void Main()
{Point p = new Point(3, 4);Console.WriteLine(p.Distance); // 输出 5
}
7. Switch 表达式

switch 表达式提供了一种更加简洁和功能强大的模式匹配语法。

public static string GetDayName(DayOfWeek day) => day switch
{DayOfWeek.Monday => "Monday",DayOfWeek.Tuesday => "Tuesday",DayOfWeek.Wednesday => "Wednesday",DayOfWeek.Thursday => "Thursday",DayOfWeek.Friday => "Friday",DayOfWeek.Saturday => "Saturday",DayOfWeek.Sunday => "Sunday",_ => throw new ArgumentOutOfRangeException()
};public static void Main()
{DayOfWeek today = DayOfWeek.Wednesday;Console.WriteLine(GetDayName(today)); // 输出 "Wednesday"
}
8. 空合并赋值 (Null-Coalescing Assignment)

空合并赋值运算符 ??= 使得在变量为 null 时赋值更加简便。

public static void Main()
{string? name = null;name ??= "default";Console.WriteLine(name); // 输出 "default"
}

C# 8.0 引入的这些新特性大大的我们能够编写更高效、更易维护的代码。从可空引用类型到异步流,再到模式匹配和默认接口方法,这些改进不仅提高了开发体验,还提升了代码的安全性和可读性。在实际开发中,合理使用这些新特性,可以帮助我们写出更优雅、更可靠的程序。

相关文章:

C# 8.0 新语法的学习和使用

C# 8.0 是微软在 2019 年 9 月 23 日随 .NET Core 3.0 一同发布的一个重要版本更新&#xff0c;带来了许多新的语言特性和改进。本文将详细介绍 C# 8.0 的新语法&#xff0c;并通过实际应用案例展示这些新特性的使用方法。 目录 1. 可空引用类型 2. 异步流 3. 默认接口方…...

数据结构——约瑟夫环C语言链表实现

约瑟夫环问题由古罗马史学家约瑟夫&#xff08;Josephus&#xff09;提出&#xff0c;他参加并记录了公元66—70年犹太人反抗罗马的起义。在城市沦陷之后&#xff0c;他和40名死硬的将士在附近的一个洞穴中避难。起义者表示“宁为玉碎不为瓦全”&#xff0c;约瑟夫则想“留得青…...

【MyBatis】——入门基础知识必会内容

&#x1f3bc;个人主页&#xff1a;【Y小夜】 &#x1f60e;作者简介&#xff1a;一位双非学校的大二学生&#xff0c;编程爱好者&#xff0c; 专注于基础和实战分享&#xff0c;欢迎私信咨询&#xff01; &#x1f386;入门专栏&#xff1a;&#x1f387;【MySQL&#xff0…...

react父调用子的方法,子调用父的方法

父调用子的方法 // 子组件 import React, { useRef, useEffect } from react;const ChildComponent ({ childMethodRef }) > {const childMethod useRef(null);useEffect(() > {childMethodRef.current childMethod;}, []);const someMethod () > {console.log(子…...

C#知识|账号管理系统:UI层-添加账号窗体设计思路及流程。

哈喽,你好啊,我是雷工! 前边练习过详情页窗体的设计思路及流程: 《C#知识|上位机UI设计-详情窗体设计思路及流程(实例)》 本节练习添加账号窗体的UI设计,以下为学习笔记。 01 效果展示 02 添加窗体 在UI层添加Windows窗体,设置名称为:FrmAddAcount.cs 设置窗体属…...

【机器学习】初学者经典案例(随记)

&#x1f388;边走、边悟&#x1f388;迟早会好 一、概念 机器学习是一种利用数据来改进模型性能的计算方法&#xff0c;属于人工智能的一个分支。它旨在让计算机系统通过经验自动改进&#xff0c;而不需要明确编程。 类型 监督学习&#xff1a;使用带标签的数据进行训练&…...

进阶版智能家居系统Demo[C#]:整合AI和自动化

引言 在基础智能家居系统的基础上&#xff0c;我们将引入更多高级功能&#xff0c;包括AI驱动的自动化控制、数据分析和预测。这些进阶功能将使智能家居系统更加智能和高效。 目录 高级智能家居功能概述使用C#和AI实现智能家居自动化实现智能照明系统的高级功能 自动调节亮度…...

IC后端设计中的shrink系数设置方法

我正在「拾陆楼」和朋友们讨论有趣的话题,你⼀起来吧? 拾陆楼知识星球入口 在一些成熟的工艺节点通过shrink的方式(光照过程中缩小特征尺寸比例)得到了半节点,比如40nm从45nm shrink得到,28nm从32nm shrink得到,由于半节点的性能更优异,成本又低,漏电等不利因素也可以…...

在NVIDIA Jetson平台离线部署大模型

在NVIDIA Jetson平台离线部署大模型&#xff0c;开启离线具身智能新纪元。 本项目提供一种将LMDeploy移植到NVIDIA Jetson系列边缘计算卡的方法&#xff0c;并在Jetson计算卡上运行InternLM系列大模型&#xff0c;为离线具身智能提供可能。 最新新闻&#x1f389; [2024/3/1…...

51单片机嵌入式开发:8、 STC89C52RC 操作LCD1602原理

STC89C52RC 操作LCD1602原理 1 LCD1602概述1.1 LCD1602介绍1.2 LCD1602引脚说明1.3 LCD1602指令介绍 2 LCD1602外围电路2.1 LCD1602接线方法2.2 LCD1602电路原理 3 LCD1602软件操作3.1 LCD1602显示3.2 LCD1602 protues仿真 4 总结 1 LCD1602概述 1.1 LCD1602介绍 LCD1602是一种…...

数字化时代的供应链管理综合解决方案

目录 引言背景与意义供应链管理综合解决方案的目标 &#x1f4c4;供应链管理系统主要功能系统优势 &#x1f4c4;物流管理系统主要功能系统优势 &#x1f4c4;订单管理系统主要功能应用场景 &#x1f4c4;仓储管理系统系统亮点主要功能系统优势 &#x1f4c4;商城管理系统主要功…...

CentOS 安装 annie/lux,以及 annie/lux 的使用

annie 介绍 如果第一次听到 annie 想必都会觉得陌生&#xff0c;annie 被大家称为视频下载神器&#xff0c;annie 作者介绍说可以下载抖音、哔哩哔哩、优酷、爱奇艺、芒果TV、YouTube、Tumblr、Vimeo 等平台的视频。 githup&#xff1a;https://github.com/pingf/annie 支持…...

拥抱UniHttp,规范Http接口对接之旅

前言 如果你项目里还在用传统的编程式Http客户端比如HttpClient、Okhttp去直接对接第三方Http接口&#xff0c; 那么你项目一定充斥着大量的对接逻辑和代码&#xff0c; 并且针对不同的对接渠道方需要每次封装一次调用的简化&#xff0c; 一旦封装不好系统将会变得难以维护&am…...

Python 给存入 Redis 的键值对设置过期时间

Redis 是一种内存中的数据存储系统&#xff0c;与许多传统数据库相比&#xff0c;它具有一些优势&#xff0c;其中之一就是可以设置数据的过期时间。通过 Redis 的过期时间设置&#xff0c;可以为存储在 Redis 中的数据设置一个特定的生存时间。一旦数据到达过期时间&#xff0…...

在linux中安装docker

文章目录 1、安装依赖2、安装docker的下载源3、安装docker4、设置Docker服务开机自启 1、安装依赖 sudo yum install -y yum-utils2、安装docker的下载源 sudo yum-config-manager \--add-repo \https://download.docker.com/linux/centos/docker-ce.repohttps://download.do…...

【JVM-04】线上CPU100%

【JVM-04】线上CPU100% 1. 如何排查2. 再举一个例子 1. 如何排查 ⼀般CPU100%疯狂GC&#xff0c;都是死循环的锅&#xff0c;那怎么排查呢&#xff1f;先进服务器&#xff0c;⽤top -c 命令找出当前进程的运⾏列表按⼀下 P 可以按照CPU使⽤率进⾏排序显示Java进程 PID 为 2609…...

try catch 解决大问题

项目开发中遇到一个棘手的bug&#xff0c;react前端项目独自运行时一切正常&#xff0c;但是把项目集成到使用wujie的大平台微前端项目中之后&#xff0c;突然有个地方无故报错&#xff0c;导致程序运行停止&#xff0c;后续的方法不再执行。报错如下&#xff1a; DOMExceptio…...

手动解析Collection

即将被解析的json {"collection": {"templates": [{"data": [{"name": "plantCode","value": "MSHG_KFXHS02"}, {"name": "details","value": [{"plantMedicament…...

list模拟实现【C++】

文章目录 全部的实现代码放在了文章末尾准备工作包含头文件定义命名空间类的成员变量为什么节点类是用struct而不是class呢&#xff1f;为什么要写get_head_node? 迭代器迭代器在list类里的实例化和重命名普通迭代器operator->()的作用是什么&#xff1f; const迭代器反向迭…...

nginx正向代理、反向代理、负载均衡

nginx.conf nginx首要处理静态页面 反向代理 动态请求 全局模块 work processes 1; 设置成服务器内核数的两倍&#xff08;一般不不超过8个超过8个反而会降低性能一般4个 1-2个也可以&#xff09; netstat -antp | grep 80 查端口号 *1、events块&#xff1a;* 配置影响ngi…...

7.4.分块查找

一.分块查找的算法思想&#xff1a; 1.实例&#xff1a; 以上述图片的顺序表为例&#xff0c; 该顺序表的数据元素从整体来看是乱序的&#xff0c;但如果把这些数据元素分成一块一块的小区间&#xff0c; 第一个区间[0,1]索引上的数据元素都是小于等于10的&#xff0c; 第二…...

8k长序列建模,蛋白质语言模型Prot42仅利用目标蛋白序列即可生成高亲和力结合剂

蛋白质结合剂&#xff08;如抗体、抑制肽&#xff09;在疾病诊断、成像分析及靶向药物递送等关键场景中发挥着不可替代的作用。传统上&#xff0c;高特异性蛋白质结合剂的开发高度依赖噬菌体展示、定向进化等实验技术&#xff0c;但这类方法普遍面临资源消耗巨大、研发周期冗长…...

iPhone密码忘记了办?iPhoneUnlocker,iPhone解锁工具Aiseesoft iPhone Unlocker 高级注册版​分享

平时用 iPhone 的时候&#xff0c;难免会碰到解锁的麻烦事。比如密码忘了、人脸识别 / 指纹识别突然不灵&#xff0c;或者买了二手 iPhone 却被原来的 iCloud 账号锁住&#xff0c;这时候就需要靠谱的解锁工具来帮忙了。Aiseesoft iPhone Unlocker 就是专门解决这些问题的软件&…...

华为云Flexus+DeepSeek征文|DeepSeek-V3/R1 商用服务开通全流程与本地部署搭建

华为云FlexusDeepSeek征文&#xff5c;DeepSeek-V3/R1 商用服务开通全流程与本地部署搭建 前言 如今大模型其性能出色&#xff0c;华为云 ModelArts Studio_MaaS大模型即服务平台华为云内置了大模型&#xff0c;能助力我们轻松驾驭 DeepSeek-V3/R1&#xff0c;本文中将分享如何…...

React---day11

14.4 react-redux第三方库 提供connect、thunk之类的函数 以获取一个banner数据为例子 store&#xff1a; 我们在使用异步的时候理应是要使用中间件的&#xff0c;但是configureStore 已经自动集成了 redux-thunk&#xff0c;注意action里面要返回函数 import { configureS…...

JVM 内存结构 详解

内存结构 运行时数据区&#xff1a; Java虚拟机在运行Java程序过程中管理的内存区域。 程序计数器&#xff1a; ​ 线程私有&#xff0c;程序控制流的指示器&#xff0c;分支、循环、跳转、异常处理、线程恢复等基础功能都依赖这个计数器完成。 ​ 每个线程都有一个程序计数…...

群晖NAS如何在虚拟机创建飞牛NAS

套件中心下载安装Virtual Machine Manager 创建虚拟机 配置虚拟机 飞牛官网下载 https://iso.liveupdate.fnnas.com/x86_64/trim/fnos-0.9.2-863.iso 群晖NAS如何在虚拟机创建飞牛NAS - 个人信息分享...

Cilium动手实验室: 精通之旅---13.Cilium LoadBalancer IPAM and L2 Service Announcement

Cilium动手实验室: 精通之旅---13.Cilium LoadBalancer IPAM and L2 Service Announcement 1. LAB环境2. L2公告策略2.1 部署Death Star2.2 访问服务2.3 部署L2公告策略2.4 服务宣告 3. 可视化 ARP 流量3.1 部署新服务3.2 准备可视化3.3 再次请求 4. 自动IPAM4.1 IPAM Pool4.2 …...

9-Oracle 23 ai Vector Search 特性 知识准备

很多小伙伴是不是参加了 免费认证课程&#xff08;限时至2025/5/15&#xff09; Oracle AI Vector Search 1Z0-184-25考试&#xff0c;都顺利拿到certified了没。 各行各业的AI 大模型的到来&#xff0c;传统的数据库中的SQL还能不能打&#xff0c;结构化和非结构的话数据如何和…...

Linux 下 DMA 内存映射浅析

序 系统 I/O 设备驱动程序通常调用其特定子系统的接口为 DMA 分配内存&#xff0c;但最终会调到 DMA 子系统的dma_alloc_coherent()/dma_alloc_attrs() 等接口。 关于 dma_alloc_coherent 接口详细的代码讲解、调用流程&#xff0c;可以参考这篇文章&#xff0c;我觉得写的非常…...