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

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);
}

相关文章:

C#新语法

目录 顶级语句&#xff08;C#9.0&#xff09; using 全局using指令&#xff08;C#10.0&#xff09; using资源管理问题 using声明&#xff08;C#8.0&#xff09; using声明陷阱 错误写法 正确写法 文件范围的命名空间声明&#xff08;C#10.0&#xff09; 可空引用类型…...

微信小程序压缩图片

由于wx.compressImage(Object object) iOS 仅支持压缩 JPG 格式图片。所以我们需要做一下特殊的处理&#xff1a; 1.获取文件&#xff0c;判断文件是否大于设定的大小 2.如果大于则使用canvas进行绘制&#xff0c;并生成新的图片路径 3.上传图片 async chooseImage() {let …...

通义灵码插件保姆级教学-IDEA(安装及使用)

一、JetBrains IDEA 中安装指南 官方下载指南&#xff1a;通义灵码安装教程-阿里云 步骤 1&#xff1a;准备工作 操作系统&#xff1a;Windows 7 及以上、macOS、Linux&#xff1b; 下载并安装兼容的 JetBrains IDEs 2020.3 及以上版本&#xff0c;通义灵码与以下 IDE 兼容&…...

windows下本地部署安装hadoop+scala+spark-【不需要虚拟机】

注意版本依赖【本实验版本如下】 Hadoop 3.1.1 spark 2.3.2 scala 2.11 1.依赖环境 1.1 java 安装java并配置环境变量【如果未安装搜索其他教程】 环境验证如下&#xff1a; C:\Users\wangning>java -version java version "1.8.0_261" Java(TM) SE Runti…...

倍频增量式编码器--角度插值法输出A,B(Aangular Interpolation)

问题是&#xff1a; 最大速度&#xff0c;周期刻度&#xff0c;最小细分刻度&#xff0c;可以计算得到&#xff1a; 结论&#xff1a; 按照最高速度采样&#xff1b;数字A,B输出间隔时间&#xff1a;按照计算角度 插入细分角度运算算时间&#xff08;最快速度&#xff09;&a…...

LSM对于特殊数据的优化手段

好的&#xff0c;我现在需要帮助用户理解如何针对不同的特殊工作负载优化LSM树结构。用户提到了四种情况&#xff1a;时态数据、小数据、半排序数据和追加为主的数据。我需要分别解释每种情况下的优化方法&#xff0c;并参考用户提供的LHAM的例子&#xff0c;可能还有其他例子。…...

83,【7】BUUCTF WEB [MRCTF2020]你传你[特殊字符]呢

进入靶场 图片上这个人和另一道题上的人长得好像 54&#xff0c;【4】BUUCTF WEB GYCTF2020Ezsqli-CSDN博客 让我们上传文件 桌面有啥传啥 /var/www/html/upload/344434f245b7ac3a4fae0a6342d1f94a/123.php.jpg 成功后我就去用蚁剑连了&#xff0c;连不上 看了别的wp知需要…...

Go语言入门指南(二): 数据类型

文章创作不易&#xff0c;麻烦大家点赞关注转发一键三连。 在上一篇文章&#xff0c;我们已经完成了开发环境的搭建&#xff0c;成功创建了第一个“Hello, World”程序&#xff0c;并且对变量的声明和初始化有了初步的认识。在这篇文章中&#xff0c;我们将主要介绍Go语言的数据…...

2025.1.26机器学习笔记:C-RNN-GAN文献阅读

2025.1.26周报 文献阅读题目信息摘要Abstract创新点网络架构实验结论缺点以及后续展望 总结 文献阅读 题目信息 题目&#xff1a; C-RNN-GAN: Continuous recurrent neural networks with adversarial training会议期刊&#xff1a; NIPS作者&#xff1a; Olof Mogren发表时间…...

FAST-DDS and ROS2 RQT connect

reference: FAST-DDS与ROS2通信_ros2 收fastdds的数据-CSDN博客 software version: repositories: foonathan_memory_vendor: type: git url: https://github.com/eProsima/foonathan_memory_vendor.git version: v1.1.0 fastcdr: …...

GESP2024年3月认证C++六级( 第三部分编程题(2)好斗的牛)

参考程序&#xff08;暴力枚举&#xff09; #include <iostream> #include <vector> #include <algorithm> using namespace std; int N; vector<int> a, b; int ans 1e9; int main() {cin >> N;a.resize(N);b.resize(N);for (int i 0; i &l…...

记一次STM32编译生成BIN文件过大的问题(基于STM32CubeIDE)

文章目录 问题描述解决方法更多拓展 问题描述 最近在一个项目中使用了 STM32H743 单片机&#xff08;基于 STM32CubeIDE GCC 开发&#xff09;&#xff0c;它的内存分为了 DTCMRAM RAM_D1 RAM_D2 …等很多部分。其中 DTCM 的速度是比通常的内存要快的&#xff0c;缺点是不支持…...

【暴力洗盘】的实战技术解读-北玻股份和三变科技

龙头的上攻与回调动作都是十分惊人的。不惊人不足以吸引投资者的关注&#xff0c;不惊人也就不能成为龙头了。 1.建筑节能概念--北玻股份 建筑节能&#xff0c;是指在建筑材料生产、房屋建筑和构筑物施工及使用过程中&#xff0c;满足同等需要或达到相同目的的条件下&#xf…...

Day42:列表的组合

在Python 中&#xff0c;列表的组合是指将两个或多个列表合并成一个新的列表。Python 提供了多种方法来实现这一操作&#xff0c;每种方法都有其特定的应用场景。今天我们将学习如何通过不同的方式组合列表。 1. 使用 运算符进行列表合并 最直接的方式是使用 运算符&#x…...

mantisbt添加修改用户密码

文章目录 问题当前版本安装流程创建用户修改密码老的方式探索阶段 问题 不太好改密码啊。貌似必须要域名要发邮件。公司太穷&#xff0c;看不见的东西不关心&#xff0c;只能改源码了。 当前版本 当前mantisbt版本 2.27 php版本 7.4.3 安装流程 &#xff08;下面流程不是…...

DroneXtract:一款针对无人机的网络安全数字取证工具

关于DroneXtract DroneXtract是一款使用 Golang 开发的适用于DJI无人机的综合数字取证套件&#xff0c;该工具可用于分析无人机传感器值和遥测数据、可视化无人机飞行地图、审计威胁活动以及提取多种文件格式中的相关数据。 功能介绍 DroneXtract 具有四个用于无人机取证和审…...

简单树形菜单

引言 在网页开发中&#xff0c;树形菜单是一种非常实用的&#xff0c;它可以清晰地展示具有层级关系的数据&#xff0c;并且能够方便用户进行导航和操作。 整体思路 整个项目主要分为三个部分&#xff1a;HTML 结构搭建、CSS 样式设计和 JavaScript 交互逻辑实现。通过 XMLHt…...

Windows 靶机常见服务、端口及枚举工具与方法全解析:SMB、LDAP、NFS、RDP、WinRM、DNS

在渗透测试中&#xff0c;Windows 靶机通常会运行多种服务&#xff0c;每种服务都有其默认端口和常见的枚举工具及方法。以下是 Windows 靶机常见的服务、端口、枚举工具和方法的详细说明&#xff1a; 1. SMB&#xff08;Server Message Block&#xff09; 端口 445/TCP&…...

RNN实现阿尔茨海默症的诊断识别

本文为为&#x1f517;365天深度学习训练营内部文章 原作者&#xff1a;K同学啊 一 导入数据 import torch.nn as nn import torch.nn.functional as F import torchvision,torch from sklearn.preprocessing import StandardScaler from torch.utils.data import TensorDatase…...

14-6-1C++STL的list

(一&#xff09;list容器的基本概念 list容器简介&#xff1a; 1.list是一个双向链表容器&#xff0c;可高效地进行插入删除元素 2.list不可以随机存取元素&#xff0c;所以不支持at.(pos)函数与[ ]操作符 &#xff08;二&#xff09;list容器头部和尾部的操作 list对象的默…...

零门槛NAS搭建:WinNAS如何让普通电脑秒变私有云?

一、核心优势&#xff1a;专为Windows用户设计的极简NAS WinNAS由深圳耘想存储科技开发&#xff0c;是一款收费低廉但功能全面的Windows NAS工具&#xff0c;主打“无学习成本部署” 。与其他NAS软件相比&#xff0c;其优势在于&#xff1a; 无需硬件改造&#xff1a;将任意W…...

基于大模型的 UI 自动化系统

基于大模型的 UI 自动化系统 下面是一个完整的 Python 系统,利用大模型实现智能 UI 自动化,结合计算机视觉和自然语言处理技术,实现"看屏操作"的能力。 系统架构设计 #mermaid-svg-2gn2GRvh5WCP2ktF {font-family:"trebuchet ms",verdana,arial,sans-…...

超短脉冲激光自聚焦效应

前言与目录 强激光引起自聚焦效应机理 超短脉冲激光在脆性材料内部加工时引起的自聚焦效应&#xff0c;这是一种非线性光学现象&#xff0c;主要涉及光学克尔效应和材料的非线性光学特性。 自聚焦效应可以产生局部的强光场&#xff0c;对材料产生非线性响应&#xff0c;可能…...

【入坑系列】TiDB 强制索引在不同库下不生效问题

文章目录 背景SQL 优化情况线上SQL运行情况分析怀疑1:执行计划绑定问题?尝试:SHOW WARNINGS 查看警告探索 TiDB 的 USE_INDEX 写法Hint 不生效问题排查解决参考背景 项目中使用 TiDB 数据库,并对 SQL 进行优化了,添加了强制索引。 UAT 环境已经生效,但 PROD 环境强制索…...

什么是库存周转?如何用进销存系统提高库存周转率?

你可能听说过这样一句话&#xff1a; “利润不是赚出来的&#xff0c;是管出来的。” 尤其是在制造业、批发零售、电商这类“货堆成山”的行业&#xff0c;很多企业看着销售不错&#xff0c;账上却没钱、利润也不见了&#xff0c;一翻库存才发现&#xff1a; 一堆卖不动的旧货…...

ardupilot 开发环境eclipse 中import 缺少C++

目录 文章目录 目录摘要1.修复过程摘要 本节主要解决ardupilot 开发环境eclipse 中import 缺少C++,无法导入ardupilot代码,会引起查看不方便的问题。如下图所示 1.修复过程 0.安装ubuntu 软件中自带的eclipse 1.打开eclipse—Help—install new software 2.在 Work with中…...

大语言模型(LLM)中的KV缓存压缩与动态稀疏注意力机制设计

随着大语言模型&#xff08;LLM&#xff09;参数规模的增长&#xff0c;推理阶段的内存占用和计算复杂度成为核心挑战。传统注意力机制的计算复杂度随序列长度呈二次方增长&#xff0c;而KV缓存的内存消耗可能高达数十GB&#xff08;例如Llama2-7B处理100K token时需50GB内存&a…...

LLaMA-Factory 微调 Qwen2-VL 进行人脸情感识别(二)

在上一篇文章中,我们详细介绍了如何使用LLaMA-Factory框架对Qwen2-VL大模型进行微调,以实现人脸情感识别的功能。本篇文章将聚焦于微调完成后,如何调用这个模型进行人脸情感识别的具体代码实现,包括详细的步骤和注释。 模型调用步骤 环境准备:确保安装了必要的Python库。…...

二维FDTD算法仿真

二维FDTD算法仿真&#xff0c;并带完全匹配层&#xff0c;输入波形为高斯波、平面波 FDTD_二维/FDTD.zip , 6075 FDTD_二维/FDTD_31.m , 1029 FDTD_二维/FDTD_32.m , 2806 FDTD_二维/FDTD_33.m , 3782 FDTD_二维/FDTD_34.m , 4182 FDTD_二维/FDTD_35.m , 4793...

负载均衡器》》LVS、Nginx、HAproxy 区别

虚拟主机 先4&#xff0c;后7...