C#新语法

目录

顶级语句(C#9.0)

using

全局using指令(C#10.0)

using资源管理问题

using声明(C#8.0)

using声明陷阱

错误写法

正确写法

文件范围的命名空间声明(C#10.0)

可空引用类型(C#8.0)

使用

使用!抑制警告

init

record记录类型(C#9.0)

 record的原理及深入

record深入

with拷贝


顶级语句(C#9.0)

  1. 直接在C#文件中直接编写入口方法的代码,不用类,不用Main。经典写法仍然支持。
  2. 同一个项目中只能有一个文件具有顶级语句。
  3. 顶级语句中可以直接使用await语法,也可以声明函数

using

全局using指令(C#10.0)

  1. 将 global 修饰符添加到 using 前,这个命名空间就应用到整个项目,不用重复using。
  2. 通常创建一个专门用来编写全局using代码的C#文件。
  3. 如果csproj中启用了<ImplicitUsings>enable</ImplicitUsings>,编译器会自动隐式增加对于System、System.Linq等常用命名空间的引入,不同各类型项目引入的命名空间也不一样。

using资源管理问题

实现了IDisposible接口的对象可以用using进行管理。

问题:如果一段代码中有很多非托管资源需要被释放的话,代码中就会存在着多个嵌套的using语句。

using声明(C#8.0)

在实现了Idisposable/IAsyncDisposable接口的类型的变量声明前加上using,当代码执行离开变量的作用域时,对象就会被释放。

using声明陷阱

错误写法
using var outSteam = File.OpenWrite("e:/1.txt");
using var writer = new StreamWriter(outSteam);
writer.WriteLine("Hello");
string s = File.ReadAllText("e:/1.txt");
Console.WriteLine(s);
正确写法
using (var outSteam = File.OpenWrite("e:/1.txt"))
using (var writer = new StreamWriter(outSteam))
{writer.WriteLine("Hello");
}
string s = File.ReadAllText("e:/1.txt");
Console.WriteLine(s);{using var outSteam = File.OpenWrite("e:/1.txt");using var writer = new StreamWriter(outSteam);writer.WriteLine("Hello");
}
string s = File.ReadAllText("e:/1.txt");
Console.WriteLine(s);

文件范围的命名空间声明(C#10.0)

在之前版本的C#中,类型必须定义在namespace中。

namespace NewGrammar;
class Book
{public int Id { get; set; }public string Name { get; set; }
}

可空引用类型(C#8.0)

C#数据类型分为值类型引用类型两种,值类型的变量不可以为空,而引用类型变量可以为空。

问题:如果不注意检查引用类型变量是否可空,就有可能造成程序中出现NullReferenceException异常。

使用

  1. csproj中<Nullable>enable</Nullable>启用可空引用类型检查。
  2. 在引用类型后添加“?”修饰符来声明这个类型是可空的。对于没有添加“?”修饰符的引用类型的变量,如果编译器发现存在为这个变量赋值null的可能性的时候,编译器会给出警告信息。
class Book
{public int Id { get; set; }public string? Name { get; set; }
}

使用!抑制警告

如果程序员确认被访问的变量、成员确实不会出现为空的情况,也可以在访问可空的变量、成员的时候加上!来抑制编译器的警告。不要滥用。

init

仅在对象构造期间为属性或索引器元素赋值,一旦初始化对象,将无法更改。

class Pig
{public int id { get; init; }
}

record记录类型(C#9.0)

C#中的==运算符默认是判断两个变量指向的是否是同一个对象,即使两个对象内容完全一样,也不相等。可以通过重写Equals方法、重写==运算符等来解决这个问题,不过需要开发人员编写非常多的额外代码。
2、在C#9.0中增加了记录(record)类型的语法,编译器会为我们自动生成Equals、GetHashcode等方法。

namespace SelfReferecingOrganizationalStructureTree;record Book(int Id, string Name);class Program
{static void Main(string[] args){Book b1=new Book(1,"a1");Book b2=new Book(1,"a1");Book b3=new Book(2,"a1");Console.WriteLine(b1.ToString());Console.WriteLine(b1==b2);Console.WriteLine(b2==b3);Console.WriteLine(object.ReferenceEquals(b1, b2));}
}

 record的原理及深入

  1. 编译器会根据Book类型中的属性定义,自动为Book类型生成包含全部属性的构造方法。注意,默认情况下,编译器会生成一个包含所有属性的构造方法,因此,我们编写new Book()、new Book(“a1”)这两种写法都是不可以的。也会生成ToString方法和Equals等方法。
  2. 通过反编译看背后原理。避免反编译器的优化,需要把反编译器生成的代码改成C#8.0的语法。结论:record就是普通的一个类。
  3. record数据类型为我们提供了为所有属性赋值的构造方法,所有属性都是只读的,而且对象可以进行值相等性比较,并且提供了可读性强的ToString()返回值。在需要编写一些不可变类并且需要进行对象值比较的对象时候,record可以帮我们把代码的编写难度大大降低。
record深入
  1. 可以实现部分属性是只读的、而部分属性是可以读写。
    record Book(int Id, string Name)
    {public string? Author { get; set; }
    }class Program
    {static void Main(string[] args){Book b1 = new Book(1, "计算机网络");b1.Author = "小明";Console.WriteLine(b1.ToString());}
    }
  2. 默认生成的构造方法的行为不能修改,我们可以为类型提供多个构造方法,然后其他构造方法通过this调用默认的构造方法。
    record Book(int Id, string Name)
    {public string? Author { get; set; }public Book(int Id, string Name, string Author) : this(Id, Name){this.Author = Author;}
    }
  3. 也推荐使用只读属性的类型。这样的所有属性都为只读的类型叫做“不可变类型”,可以让程序逻辑简单,减少并发访问、状态管理等的麻烦。
with拷贝
  1. record也是普通类,变量的赋值是引用的传递。这是和结构体不同之处。
  2. 生成一个对象的副本,这个对象的其他属性值与原对象的相同,只有一个或者少数几个属性改变。
  3. 麻烦的做法:Book b1 = new Book(1, "计算机网络", "小明");
    用with关键字简化:Book b2 = b1 with { Id = 2, Name = "操作系统" }; 创建的也是拷贝。
static void Main(string[] args)
{Book b1 = new Book(1, "计算机网络", "小明");Book b2 = b1 with { Id = 2, Name = "操作系统" };Console.WriteLine(b1);Console.WriteLine(b2);
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/7822.html

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

相关文章

WPF基础 | WPF 布局系统深度剖析:从 Grid 到 StackPanel

WPF基础 | WPF 布局系统深度剖析&#xff1a;从 Grid 到 StackPanel 一、前言二、Grid 布局&#xff1a;万能的布局王者2.1 Grid 布局基础&#xff1a;构建网格世界2.2 子元素定位与跨行列&#xff1a;布局的精细操控2.3 自适应布局&#xff1a;灵活应变的秘诀 三、StackPanel…

基于微信小程序的网上订餐管理系统

作者&#xff1a;计算机学姐 开发技术&#xff1a;SpringBoot、SSM、Vue、MySQL、JSP、ElementUI、Python、小程序等&#xff0c;“文末源码”。 专栏推荐&#xff1a;前后端分离项目源码、SpringBoot项目源码、Vue项目源码、SSM项目源码、微信小程序源码 精品专栏&#xff1a;…

网盘资源查找工具---AI功能

01 软件介绍 这是一款融入了ai技术的网盘搜索神器&#xff0c;可以让你更快&#xff0c;更精准的找到自己需要的文件&#xff0c;不管你是找影视&#xff0c;音乐&#xff0c;还是找软件或者学习资料都可以&#xff0c;欢迎前来使用。 02 功能展示 该软件非常简洁&#xff…

JAVA:利用 Content Negotiation 实现多样式响应格式的技术指南

1、简述 Content Negotiation&#xff08;内容协商&#xff09; 是 RESTful 服务的重要特性&#xff0c;允许客户端和服务器根据请求的不同特性动态选择适合的响应格式。它是一种在 HTTP 协议中实现的机制&#xff0c;通过它&#xff0c;服务器能够根据客户端需求返回适合的内…

Hook 函数

什么是hook函数&#xff1f; 在计算机编程中&#xff0c;hook函数是指在特定的事件发生时被调用的函数&#xff0c;用于在事件发生前或后进行一些特定的操作。通常&#xff0c;hook函数作为回调函数被注册到事件处理器中&#xff0c;当事件发生时&#xff0c;事件处理器会自动…

飞牛NAS新增虚拟机功能,如果使用虚拟机网卡直通安装ikuai软路由(如何解决OVS网桥绑定失败以及打开ovs后无法访问飞牛nas等问题)

文章目录 📖 介绍 📖🏡 演示环境 🏡📒 飞牛NAS虚拟机安装爱快教程 📒🛠️ 前期准备🌐 网络要求💾 下载爱快镜像🚀 开始安装💻 开启IOMMU直通🌐 配置网络🚨 解决OVS网桥绑定失败以及打开ovs后无法访问飞牛nas等问题➕ 创建虚拟机🎯 安装ikuai💻 进…

js手撕 | 使用css画一个三角形 使用js修改元素样式 驼峰格式与“-”格式相互转化

1.使用css画一个三角形 借助 border 实现&#xff0c;在 width 和 height 都为 0 时&#xff0c;设置 border&#xff0c;便会呈现三角形。想要哪个方向的三角形&#xff0c;设置其他三边为 透明即可。同时&#xff0c;可以通过调整不同边的宽度&#xff0c;来调整三角形的高度…

IoTDB 2025 春节值班与祝福

2025 春节快乐 瑞蛇迎吉庆&#xff0c;祥光映华年&#xff0c;2025 春节已近在眼前。社区祝福 IoTDB 的所有关注者、支持者、使用者 2025 新年快乐&#xff0c;“蛇”来运转&#xff01; IoTDB 团队的春节放假时间为 2025 年 1 月 27 日至 2 月 4 日&#xff0c;1 月 25 日、26…

React和Vue有什么区别,如何选择?

React和Vue有什么区别&#xff0c;如何选择&#xff1f; React 和 Vue 是当前最受欢迎的前端框架之一&#xff0c;两者在开发者中都有极高的声誉。它们都旨在帮助开发人员构建用户界面&#xff0c;但在实现方式和适用场景上有所不同。如果你正考虑在项目中选择 React 或 Vue&a…

poi在word中打开本地文件

poi版本 5.2.0 方法1&#xff1a;使用XWPFFieldRun&#xff08;推荐&#xff09; 比如打开当前相对路径的aaaaa.docx XWPFFieldRun run paragraph.createFieldRun();CTRPr ctrPr run.getCTR().addNewRPr();CTFonts font ctrPr.addNewRFonts();// 设置字体font.setAscii(&quo…

15_业务系统基类

创建脚本 SystemRoot.cs 因为 业务系统基类的子类 会涉及资源加载服务层ResSvc.cs 和 音乐播放服务层AudioSvc.cs 所以在业务系统基类 提取引用资源加载服务层ResSvc.cs 和 音乐播放服务层AudioSvc.cs 并调用单例初始化 using UnityEngine; // 功能 : 业务系统基类 public c…

Linux 权限管理

hello&#xff01;这里是敲代码的小董&#xff0c;很荣幸您阅读此文&#xff0c;本文只是自己在学习Linux过程中的笔记&#xff0c;如有不足&#xff0c;期待您的评论指点和关注&#xff0c;欢迎欢迎~~ ✨✨个人主页&#xff1a;敲代码的小董 &#x1f497;&#x1f497;系列专…

可以称之为“yyds”的物联网开源框架有哪几个?

有了物联网的发展&#xff0c;我们的生活似乎也变得更加“鲜活”、有趣、便捷&#xff0c;包具有科技感的。在物联网&#xff08;IoT&#xff09;领域中&#xff0c;也有许多优秀的开源框架支持设备连接、数据处理、云服务等&#xff0c;成为被用户们广泛认可的存在。以下给大家…

【25美赛A题-F题全题目解析】2025年美国大学生数学建模竞赛(MCM/ICM)解题思路|完整代码论文集合

我是Tina表姐&#xff0c;毕业于中国人民大学&#xff0c;对数学建模的热爱让我在这一领域深耕多年。我的建模思路已经帮助了百余位学习者和参赛者在数学建模的道路上取得了显著的进步和成就。现在&#xff0c;我将这份宝贵的经验和知识凝练成一份全面的解题思路与代码论文集合…

MySQL数据库基础

1、什么是数据库 存储数据用文件就可以了&#xff0c;为什么还要弄个数据库? 文件保存数据有以下几个缺点&#xff1a; 文件的安全性问题文件不利于数据查询和管理文件不利于存储海量数据文件在程序中控制不方便 数据库存储介质&#xff1a; 磁盘内存 为了解决上述问题&a…

SAP新增公司间交易的配置点---SD部分内容

1.主要参考这里的内容进行配置&#xff0c;但是还是不够的&#xff0c;还有缺失 https://blog.csdn.net/weixin_44788719/article/details/143479599 2.缺失的内容如下&#xff1a; 要配置好销售组织与对应的工厂的关系&#xff1a;例如&#xff1a;2300销售组织要维护2300工…

数据结构(四) B树/跳表

目录 1. LRU 2. B树 3. 跳表 1. LRU: 1.1 概念: 最近最少使用算法, 就是cache缓存的算法. 因为cache(位于内存和cpu之间的存储设备)是一种容量有限的缓存, 有新的数据进入就需要将原本的数据进行排出. 1.2 LRU cache实现: #include <iostream> #include <list>…

【全栈】SprintBoot+vue3迷你商城(9)

【全栈】SprintBootvue3迷你商城&#xff08;9&#xff09; 往期的文章都在这里啦&#xff0c;大家有兴趣可以看一下 后端部分&#xff1a; 【全栈】SprintBootvue3迷你商城&#xff08;1&#xff09; 【全栈】SprintBootvue3迷你商城&#xff08;2&#xff09; 【全栈】Spr…

第 25 场 蓝桥月赛

4.喜糖摆放【算法赛】 - 蓝桥云课 问题描述 在过年时&#xff0c;蓝桥村的孩子们充满活力&#xff0c;他们化身为捣蛋鬼&#xff0c;挨家挨户寻讨喜糖。他们一共收到了N颗糖&#xff0c;每颗糖的甜度各不相同&#xff0c;第i颗糖的甜度为Ai。 然而&#xff0c;如何分配这些喜…

MySQL数据库笔记——版本号机制和CAS(Compare And Swap)

大家好&#xff0c;这里是Good Note&#xff0c;关注 公主号&#xff1a;Goodnote&#xff0c;本文详细介绍乐观锁的两种实现方式&#xff1a;版本号机制和CAS&#xff08;Compare And Swap&#xff09;。 文章目录 MySQL 内置的并发控制机制MVCC&#xff08;多版本并发控制&am…