使用现代化 C# 语法简化代码

使用现代化 C# 语法简化代码

Intro

最近几个版本的 C# 在语法中有很多的变化,有很多语法能够帮助我们大大简化代码复杂度,使得代码更加简洁,分享几个我觉得比较实用的可以让代码更加简洁的语法

Default literal expressions

在 C# 7.1 之后,我们可以使用 default 来代替一个类型的默认值,例如:

public void Test(string str = deault){}string str = default;

在之前的版本我们需要显式指定类型,如 default(string),就不需要写类型了,编译器会推断出类型

Target-Typed New Expression

在 C# 9 中,引入了 Target-Typed New Expression 语法,和上面的 default 类似,我们在创建对象的时候不再需要在编译器可以推断出类型的地方再写出类型了,这在有时候会很有用,尤其是在写一个类型非常复杂的字段的时候,我们就只需要声明一次就可以了,可以参考下面的示例:

// target-typed new expression
//private static readonly Dictionary<string, Dictionary<string, string>>
//    Dictionary = new Dictionary<string, Dictionary<string, string>>();
private static readonly Dictionary<string, Dictionary<string, string>>Dictionary = new();// array
ReviewRequest[] requests =
{new(){State = ReviewState.Rejected},new(),new(),
};

Named Tuple

从 C# 7 开始,我们可以使用 Named Tuple 来优化 Tuple 的使用,在之前的版本我们只能 Item1, Item2 这样去使用 Tuple 的 Value,但是这样很不好理解,尤其是在没有文档说明的情况下,可能每次都要去返回值的地方看一下究竟每一个元素代表什么,Named Tuple 出现了之后就相当于一个强类型的 Tuple,能够使得代码更好理解,tuple 元素的含义一目了然,举个栗子:

(string Alpha, string Beta) namedLetters = ("a", "b");
Console.WriteLine($"{namedLetters.Alpha}, {namedLetters.Beta}");(int code, string msg) result = (1, "");private static (int code, string msg) NamedTuple()
{return (0, string.Empty);
}var result = NamedTuple();
Console.WriteLine(result.code);

Deconstruct

Named Tuple 同时出现的,我们可以在类中声明一个 DeconstructConstructor 相对应,只是 Constructor 是输入参数, Deconstruct 是输出参数,来看一个示例吧:

public class Point
{public Point(double x, double y)=> (X, Y) = (x, y);public double X { get; }public double Y { get; }public void Deconstruct(out double x, out double y) =>(x, y) = (X, Y);
}var p = new Point(3.14, 2.71);
(double X, double Y) = p;

上面的示例是官方文档的一个示例,来看一个我们实际在用的一个示例吧:

public class IdNameModel
{public int Id { get; set; }public string Name { get; set; }public void Deconstruct(out int id, out string name){id = Id;name = Name;}
}

多个返回值时,有的数据不关心可以使用 “_” 来表示丢弃返回值,示例如下:

using System;
using System.Collections.Generic;public class Example
{public static void Main(){var (_, _, _, pop1, _, pop2) = QueryCityDataForYears("New York City", 1960, 2010);Console.WriteLine($"Population change, 1960 to 2010: {pop2 - pop1:N0}");}private static (string, double, int, int, int, int) QueryCityDataForYears(string name, int year1, int year2){int population1 = 0, population2 = 0;double area = 0;if (name == "New York City"){area = 468.48;if (year1 == 1960){population1 = 7781984;}if (year2 == 2010){population2 = 8175133;}return (name, area, year1, population1, year2, population2);}return ("", 0, 0, 0, 0, 0);}
}
// The example displays the following output:
//      Population change, 1960 to 2010: 393,149

Pattern-Matching

模式匹配最早开始于 C# 7.1,最早的形式如:if(a is string str),这是最简单也是最经典的一个模式匹配,它结合了之前需要两句话才能完成的功能,可以翻译成:

var str = a as string;
if(str != null) //...

除了 if,我们在 switch 里也可以使用模式匹配的

void SwitchPattern(object obj0)
{switch (obj0){case string str1:Console.WriteLine(str1);break;case int num1:Console.WriteLine(num1);break;}
}

在 C# 9 中引入了逻辑运算符 and/or/not 使得模式匹配更为强大,来看一个判断是否是合法的 Base64 字符的一个方法的变化:

C# 9 之前的代码:

private static bool IsInvalid(char value)
{var intValue = (int)value;if (intValue >= 48 && intValue <= 57)return false;if (intValue >= 65 && intValue <= 90)return false;if (intValue >= 97 && intValue <= 122)return false;return intValue != 43 && intValue != 47;
}

使用 C# 9 增强的模式匹配之后的代码:

private static bool IsInvalid(char value)
{var intValue = (int)value;return intValue switch{>= 48 and <= 57 => false,>= 65 and <= 90 => false,>= 97 and <= 122 => false,_ => intValue != 43 && intValue != 47};
}

是不是一下子清晰的很多~~

Switch Expression

Switch Expression 是 C# 8 引入的新特性,C# 9 有结合模式匹配做了进一步的增强,使得其功能更加强大,来看示例吧:

修改前的代码是这样的:

var state = ReviewState.Rejected;
var stateString = string.Empty;
switch (state)
{case ReviewState.Rejected:stateString = "0";break;case ReviewState.Reviewed:stateString = "1";break;case ReviewState.UnReviewed:stateString = "-1";break;
}

使用 switch expression 之后的代码如下:

var state = ReviewState.Rejected;
var stateString = state switch
{ReviewState.Rejected => "0",ReviewState.Reviewed => "1",ReviewState.UnReviewed => "-1",_ => string.Empty
};

是不是看起来简洁了很多,还有进一步的增加优化,来看下一个示例:

(int code, string msg) result = (0, "");
var res = result switch
{(0, _) => "success",(-1, _) => "xx",(-2, "") => "yy",(_, _) => "error"
};
Console.WriteLine(res);

猜猜不同情况的输出的结果是什么样的,再自己试着跑一下结果看看是不是符合预期吧

Index Range

Index/Range 是 C# 8 引入的一个新特性,主要优化了对元组的操作,可以更方便的做索引和切片操作

之前有过一篇详细的介绍文章,可以参考:C# 使用 Index 和 Range 简化集合操作

我们可以通过 ^(hat) 操作符来反向索引数组中的对象,可以通过 .. 来创建一个集合的子集合,来看一个简单的示例:

var arr = Enumerable.Range(1, 10).ToArray();
Console.WriteLine($"last element:{arr[^1]}");var subArray = Enumerable.Range(1, 3).ToArray();
Console.WriteLine(arr[..3].SequenceEqual(subArray) ? "StartWith" : "No");

Record

Record 是 C# 9 引入的新特性,record 是一个特殊的类,编译器会帮助我们做很多事情,会自动实现一套基于值的比较,而且可以很方便实现对象复制的功能,详细介绍可以参考之前的 record 介绍文章 C# 9 新特性 — record 解读,可以看下面这个简单的示例:

public abstract record Person(string FirstName, string LastName);
public record Teacher(string FirstName, string LastName, int Grade): Person(FirstName, LastName);
public record Student(string FirstName, string LastName, int Grade): Person(FirstName, LastName);
public static void Main()
{Person teacher = new Teacher("Nancy", "Davolio", 3);Person student = new Student("Nancy", "Davolio", 3);Console.WriteLine(teacher == student); // output: FalseStudent student2 = new Student("Nancy", "Davolio", 3);Console.WriteLine(student2 == student); // output: True
}

Top-Level Statement

Top-Level statement 是 C# 9 支持的新特性,我们可以不写 Main 方法,直接写方法体,对于一些比较简单的小工具,小测试应用来说会比较方便

using static System.Console;
WriteLine("Hello world");

More

除了上面这些新特性,你觉得还有哪些比较实用的新特性呢,欢迎留言一起讨论哈~

References

  • https://docs.microsoft.com/en-us/dotnet/csharp/whats-new/csharp-9

  • https://docs.microsoft.com/en-us/dotnet/csharp/whats-new/csharp-8

  • https://docs.microsoft.com/en-us/dotnet/csharp/whats-new/csharp-7

  • https://github.com/WeihanLi/SamplesInPractice/blob/master/CSharp9Sample/CleanCodeSample.cs

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

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

相关文章

计算机原理试题b,计算机组成原理试题B答案

计算机组成原理试题B答案 (3页)本资源提供全文预览&#xff0c;点击全文预览即可全文预览,如果喜欢文档就下载吧&#xff0c;查找使用更方便哦&#xff01;9.9 积分计算机组成原理试题B答案一、 选择题1. D 2. A 3. A&#xff0c;C 4. B 5. B 6. B 7. B 8. B 9. A 10. D二、 填…

趣图:各种程序员的键盘热力图

图0&#xff1a;不保存不舒服斯基型图1&#xff1a;复制粘贴型 图2&#xff1a;复制粘贴型专用键盘图3&#xff1a;Vim 党新手&#xff08;内心OS&#xff1a;门在哪里&#xff0c;我要退出&#xff09;图4&#xff1a;Windows 程序员图5&#xff1a;01 党终极程序员 来源&am…

创建支持依赖注入、Serilog 日志和 AppSettings 的 .NET 5 控制台应用

翻译自 Mohamad Lawand 2021年3月24日的文章 《.NET 5 Console App with Dependency Injection, Serilog Logging, and AppSettings》 [1]在本文中&#xff0c;我们将构建一个 .NET 5 控制台应用程序&#xff0c;该应用程序支持依赖注入、日志记录和 appsettings 配置。你也可以…

SmartDraw_2012_Enterprise_R20.0.1.0的安装使用

SmartDraw_2012_Enterprise_R20.0.1.0的安装使用 最近准备把所有的流程图由传统的路程图改成NS的流程图&#xff0c;网上搜索了一下关于这方面的软件&#xff0c;强力推荐这款SmartDraw&#xff0c;索性下来试一下。 下载地址为&#xff1a;http://www.7xdown.com/Download.asp…

作为一个前端,可以如何机智地弄坏一台电脑?

有人说&#xff0c;前端的界限就在浏览器那儿。无论你触发了多少bug&#xff0c;最多导致浏览器崩溃&#xff0c;对系统影响不到哪去。这就像二次元各种炫酷的毁灭世界&#xff0c;都不会导致三次元的世界末日。然而&#xff0c;作为一个前端&#xff0c;我发现是有方式打开次元…

全国计算机考试光盘,全国计算机一级模拟考试题(光盘).doc

全国计算机一级模拟考试题(光盘)【光盘】单选&#xff1a;世界上首次实现存储程序的计算机称为 ( EDSAC )。目前&#xff0c;制造计算机所用的主要电子元件是( 大规模集成电路 )。在各类计算机操作系统中,分时系统是一种 ( 多用户交互式操作系统 )。一个完整的微型计算机系统应…

IComparer实现文件名排序

↑↑↑ 点击左上角蓝字关注我&#xff0c;为您提供技术新动态。一、概要本文主要分享在文件对象处理中需要根据文件名排序思路。主要基于.net框架内提供的IComparer对象&#xff0c;它主要将定义类型为比较两个对象而实现的方法。二、详细内容1.场景在读取文件列表的时候&#…

WebService基于SoapHeader实现安全认证[webservice][.net][安全][soapheader]

WebService基于SoapHeader实现安全认证 本文仅提供通过设置SoapHeader来控制非法用户对WebService的调用&#xff0c;如果是WebService建议使用WSE3.0来保护Web服务&#xff0c;如果使用的是Viaual Studio 2008可以使用WCF&#xff0c;WCF里面提供了更多的服务认证方法。以下提…

Java 常见的 30 个误区与细节!

1 在Java中&#xff0c;没有goto语句。因为大量使用goto语句会降低程序的可读性和可维护性&#xff0c;所以Java语言取消了goto的使用。同时&#xff0c;为了避免程序员自行使用goto所带来的混乱&#xff0c;Java语言仍将goto定义为一个关键字&#xff0c;但是没有定义任何语…

信息技术上册教案了解计算机,信息技术上册全册教案

信息技术上册全册教案[课时]:1节课[教学内容]:认识媒体;认识多媒体[教学目标]:1、了解媒体的概念和分类&#xff0c;理解多媒体的内涵和特征。2、能从日常的生活和学习中感受各种媒体及其作用3、培养学生对媒体、多媒体的喜爱&#xff0c;引发他们继续学习的热情。[教学重、难点…

轻量级NuGet—BaGet

1. 介绍BaGet是一个轻量级的包管理服务。有些时候公司或者个人不希望某一些包进行公开&#xff0c;那么就需要使用私有的包管理服务程序&#xff0c;该服务是用.netcore进行编写的(感谢开发者为.NET社区做出的贡献)Github&#xff1a;https://github.com/loic-sharma/BaGet官网…

为什么这个SQL Server DBA学习PowerShell--SQL任务

我开始学习PowerShell&#xff0c;是因为我在寻找一种快速和高效的方式收集有关我的SQL Servers的信息和更好地管理我的服务器工作负载的方式。我以为&#xff0c;我正在学习是另一门新的脚本语言&#xff0c;它能帮我做到前面提到的设想。实际上&#xff0c;我发现学习 PowerS…

30张地图看懂世界格局,用大数据说话

摘要&#xff1a;世界那么大&#xff0c;要了解的数据那么复杂&#xff0c;下面知识探索小编帮您总结一下关于世界的数据。1、 世界人口聚居地红色越深人口密度越大&#xff1b;灰色代表无人地带。2、全球各国平均智商分布图颜色越浅智商越高3、全球冰川融化后的世界地图4、全世…

中科大计算机是一流学科吗,安徽2017双一流学科排行榜:中国科技大学第一

安徽省哪些大学跻身2017年国家“双一流”世界一流建设学科数量最多?安徽省高校未来哪些学科最有希望入围国家“双一流”建设学科行列?为了满足2017年全国考研考生和外国来华留学生了解中国高校学科水平的需求&#xff0c;为全国各地高校创建中国特色、世界一流学科提供决策参…

.net framework3.0_

.net framework3.0目录• 简介• 应用 .NET Framework 3.0&#xff1a;设想• 了解 .NET Framework 3.0&#xff1a;技术• 工作流 简介编辑本段回目录 .NET Framework 3.0&#xff0c;应用程序开发的目标始终如一&#xff0c;就是在最短时间内制作出最好的软件。然而&#xf…

.NET Core3.1 Dotnetty实战教程

Dotnetty实战系列视频由于在.net的环境当中对dotnetty相关资料相对较少&#xff0c;所以这里主要分享一个dotnetty使用教程希望能帮助到正在使用这套框架的开发者们。虽然这套框架已微软官方已经不在维护&#xff0c;但是这套框架里的设计是相当不错的通过阅读源码能学习到很多…

计算机u打字,win7电脑打字打不出来怎么办

在windows电脑当中&#xff0c;必不可少的一个操作就是打字了&#xff0c;输入代码需要打字&#xff0c;网页中搜索也需要打字&#xff0c;网络聊天也需要打字&#xff0c;不过最近有位win7系统用户&#xff0c;在电脑中打开浏览器&#xff0c;输入想要找的资料的时候&#xff…

我用Python爬取了14年所有的福彩3D信息,彩民们,只能帮你们到这了

作者|丁彦军来源|恋习Python前两天&#xff0c;在网上看到一个有意思的问题&#xff1a;彩票预测靠谱么&#xff1f;为什么还有那么多的人相信彩票预测&#xff1f;暂且不说&#xff0c;彩票预测是否靠谱&#xff1f;彩票预测也分人而异&#xff0c;江湖上骗术很多&#xff0c;…

C#: 8.0 和 9.0 常用新特性

在《带你了解C#每个版本新特性》 一文中介绍了&#xff0c;C# 1.0 到 7.0 的不同特性&#xff0c;本文接着介绍在 8.0 和 9.0 中的一些常用新特性。C# 8.0在 dotNET Core 3.1 及以上版本中就可以使用 C# 8 的语法&#xff0c;下面是 C# 8 中我认为比较常用的一些新功能。默认接…

选股公式 成功率测试 软件,通达信股票软件选股公式,99%的成功率,你还等什么?...

工具&#xff1a;通达信金融终端使用方法&#xff1a;1、通达信软件界面2、点击“功能”“公式系统”“公式管理器”“条件选股公式”“其他类型”&#xff0c;点击新建3、使用选股公式&#xff0c;点击ctrlt&#xff0c;弹出条件选股窗口4、选中公式&#xff0c;点击加入条件&…