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

C# 各版本语法新功能汇总

C# 8.0 以后

官网

C# 7.3

》》in

在这里插入图片描述

C# 7.2

》》 命名参数、具名参数

在这里插入图片描述

》》》 条件 ref 表达式

在这里插入图片描述

C# 7.1

》》 default 运算符
default 在C#7.1中得到了改进,不再需要default(T)了

//变量赋值C#7.0
var s = "字符串"; 
s = default(string); C#7.1
var s = "字符串"; 
s = default;//初始化赋值
C#7.0
var dstring = default(string); 
var dint = default(int); 
var dintNull = default(int?); 
var d = default(dynamic); 
var dt = default(DateTime); 
var dt1 = default(DateTime?);C#7.1
string s = default; 
int i = default; 
DateTime? dt = default; 
dynamic d = default;//可选参数
C#7.0
void Test(int a, string b = default(string)) 
{
}C#7.1
void Test(int a, string b = default) 
{
}

》》》 元组功能提供了简洁的语法来将多个数据元素分组成一个轻型数据结构。
在这里插入图片描述

(double, int) t1 = (4.5, 3);
Console.WriteLine($"Tuple with elements {t1.Item1} and {t1.Item2}.");
// Output:
// Tuple with elements 4.5 and 3.(double Sum, int Count) t2 = (4.5, 3);
Console.WriteLine($"Sum of {t2.Count} elements is {t2.Sum}.");
// Output:
// Sum of 3 elements is 4.5.

C# 7.0

》》类型模式
》》格式:expr is type varname, varname 是类型匹配后,赋值的变量名称。
在这里插入图片描述
》》常量模式
描述:用于测试表达式计算结果是否为指定的常数值。
格式:expr is constant,
constant 的可以是下面的表达式:

  1. 文字值。
  2. 一个枚举常量。
  3. 已声明 const 变量的名称。

》》var 模式 跟 》》类型模式 一样
描述:始终匹配成功,可将表达式的值绑定到新局部变量。
格式:expr is var varname
如果 expr 为 null ,is 表达式也为 true, varname 为 null。

static IEnumerable<int> Factor(int number){int max = (int)Math.Sqrt(number);for (int i = 1; i <= max; i++){if (number % i == 0){yield return i;if (i != number / i){yield return number / i;}}}}int[] testSet = { 22, 33, 44, 55};var primes = testSet.Where(n => Factor(n).ToList() is var factors&& factors.Count == 2&& factors.Contains(1)&& factors.Contains(n));

》》》Out 关键字

可以在out后面直接声明变量,例如前TryParse需要先定义再使用的两行的代码,现在一行即可: int.TryParse(s, out int num),从而简化语法。
在这里插入图片描述

》》 Tuples 元组

元组改进,可以为无组添加名称,用法:
方式1:定义:(int one, int two) tuple = (1, 2); 使用: WriteLine( " f i r s t : t u p l e . o n e , s e c o n d : t u p l e . t w o " ) ; 。方式 2 :定义: v a r t u p l e 2 = ( o n e : 1 , t w o : 2 ) ; 使用: W r i t e L i n e ( "first:{tuple.one}, second:{tuple.two}");。 方式2:定义:var tuple2 = (one: 1, two: 2); 使用: WriteLine( "firsttuple.one,secondtuple.two");。方式2:定义:vartuple2=(one:1,two:2);使用:WriteLine(“first:{tuple2.one}, second:{tuple2.two}”);。
在这里插入图片描述

》》》本地方法

在这里插入图片描述
在这里插入图片描述

》》 Ref
对ref引用进行了加强,现在可以引用一个方法中的局部变量,
语法是:在方法定义前加上 ref,同时在返回时也加上ref,
如定义函数

ref int GetDataRef(int[] data, int index)
{ 
return ref data[index];
} ref int num = ref GetDataRef(new data[]{1,2,3}, 0);

则 ref int num = ref GetDataRef(new data[]{1,2,3}, 0); 返回,对数组中第0个元素的引用。
在这里插入图片描述
》》 throw ,之前都说手动抛出异常,C# 7.0 引入了throw表达式

它允许我们在条件表达式中抛出异常。官方的解析说这对提高代码可读性有利。如:

在这里插入图片描述

》》》 数字文本语法改进 这个一般上位机用比较多
在这里插入图片描述

C# 6.0

》》Import of static type members into namespace
用于简化书写。在引用类名后,可以直接使用类的静态成员,
比如在使用 using static System.String; 后,
可以将 String.IsNullOrEmpty(str) 可以直接写成 IsNullOrEmpty(str)。
》》只读自动属性
只读自动属性提供了更简洁的语法来创建不可变类型。 你声明仅具有 get 访问器的自动属性:
public string FirstName { get; }
public string LastName { get; }
FirstName 和 LastName 属性只能在构造函数的主体中设置;
在这里插入图片描述

在这里插入图片描述

》》 自动属性初始化表达式

自动属性初始值设定项可让你在属性声明中声明自动属性的初始值。
public class Student
{
public string FirstName { get; } = “xxx”;
public string LastName { get; private set; } = “tttt”;
}
FirstName,LaseName 成员在声明它的位置处被初始化。 这样,就能更容易地仅执行一次初始化。 初始化是属性声明的一部分,可更轻松地将存储分配。

》》 Expression-bodied(正文表达式) 函数成员

你编写的许多成员是可以作为单个表达式的单个语句。 改为编写 expression-bodied 成员。这适用于方法和只读属性
在 C# 7.0 中,你可以在属性 和索引器 上实现构造函数 、终结器 以及 get 和 set 访问器
例如,重写 ToString() 通常是理想之选:
public override string ToString() => $“{LastName}, {FirstName}”;
也可以将此语法用于只读属性:
public string FullName => $“{FirstName} {LastName}”;

》》Null 条件运算符 断路运算符 ?

Null 条件运算符使 null 检查更轻松、更流畅。 将成员访问 . 替换为 ?.:
var first = person?.FirstName;
在前面的示例中,如果 Person 对象是 null,则将变量 first 赋值为 null。 否则,将 FirstName 属性的值分配给该变量。
最重要的是?. 意味着当 person 变量为 null 时,此行代码不会生成 NullReferenceException。
它会短路并返回 null。 还可以将 null 条件运算符用于数组或索引器访问。
将索引表达式中的 [] 替换为 ?[]。
first = person?.FirstName ?? “Unspecified”; //?? a??b 当a为null时则返回b,a不为null时则返回a本身。

》》字符串内插

使用 C# 6,新的字符串内插功能可以在字符串中嵌入表达式。
使用 $ 作为字符串的开头,并使用 { 和 } 之间的表达式代替序号:
public string FullName => $“{FirstName} {LastName}”;

》》异常筛选器

try{doSomething();
} catch(Exception e) when (e.Message.Contains("xx")){ProcessException(e);
} 
//等价于
catch (Exception e){if(e.Message.Contains("xx")) // 如果判断的逻辑较多,建议使用该方式。{return "Site Moved";}}

》》 nameof

Nameof是一个运算符,用于获取代码元素(如变量、类和方法等)的名称(是的,字符串)。
它通过将名称作为字符串文字返回来帮助您密切关注名称!

int myInt = 10;
Console.WriteLine(nameof(myInt)); // Output: “myInt”

在这里插入图片描述

》》索引器初始化关联集合, C# 3.0 集合初始化器
在这里插入图片描述

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • python初学之路
  • 1.33、激活可视化卷积神经网络(matalb)
  • Android init常用调试工具
  • ubuntu 20.04 系统 同一宿主机,不同ros2 docker 不通信问题
  • EPLAN 去掉PDF中的红色跳转标识
  • 【学习笔记】无人机(UAV)在3GPP系统中的增强支持(六)-人工智能控制的自主无人机用例
  • C++代码_让室友坑我
  • 搞定前端面试题——ES6同步与异步机制、async/await的使用以及Promise的使用!!!
  • 网络故障处理及分析工具:Wireshark和Tcpdump集成
  • golang单元测试性能测试常见用法
  • 【Linux 配置静态IP】Ubuntu20.04
  • MySQL双主双从实现方式
  • 音视频开发入门教程(2)配置FFmpeg编译 ~共210节
  • Scala学习笔记16: 注解
  • ‍我想我大抵是疯了,我喜欢上了写单元测试
  • es6--symbol
  • Intervention/image 图片处理扩展包的安装和使用
  • Java 多线程编程之:notify 和 wait 用法
  • java8 Stream Pipelines 浅析
  • SAP云平台里Global Account和Sub Account的关系
  • Vue小说阅读器(仿追书神器)
  • 从tcpdump抓包看TCP/IP协议
  • 配置 PM2 实现代码自动发布
  • 前端性能优化——回流与重绘
  • 通过几道题目学习二叉搜索树
  • 学习HTTP相关知识笔记
  • 运行时添加log4j2的appender
  • nb
  • 新年再起“裁员潮”,“钢铁侠”马斯克要一举裁掉SpaceX 600余名员工 ...
  • !! 2.对十份论文和报告中的关于OpenCV和Android NDK开发的总结
  • #《AI中文版》V3 第 1 章 概述
  • #HarmonyOS:软件安装window和mac预览Hello World
  • #绘制圆心_R语言——绘制一个诚意满满的圆 祝你2021圆圆满满
  • (delphi11最新学习资料) Object Pascal 学习笔记---第8章第2节(共同的基类)
  • (webRTC、RecordRTC):navigator.mediaDevices undefined
  • (二)延时任务篇——通过redis的key监听,实现延迟任务实战
  • (二十六)Java 数据结构
  • (转)关于多人操作数据的处理策略
  • .Family_物联网
  • .gitignore
  • .net core 依赖注入的基本用发
  • .NET Core实战项目之CMS 第一章 入门篇-开篇及总体规划
  • .NET Micro Framework初体验(二)
  • .NET单元测试使用AutoFixture按需填充的方法总结
  • .vollhavhelp-V-XXXXXXXX勒索病毒的最新威胁:如何恢复您的数据?
  • /bin/rm: 参数列表过长"的解决办法
  • /etc/motd and /etc/issue
  • ::前边啥也没有
  • @Autowired和@Resource装配
  • [ARC066F]Contest with Drinks Hard
  • [Armbian] 部署Docker版Home Assistent,安装HACS并连接米家设备
  • [c#基础]DataTable的Select方法
  • [CR]厚云填补_SEGDNet
  • [CSS]CSS 字体属性
  • [emacs] CUA的矩形块操作很给力啊