13 个 C# 10 特性

原文链接:https://blog.okyrylchuk.dev
原文作者:Oleg Kyrylchuk
译: 等天黑
常量的内插字符串
C# 10 允许使用在常量字符串初始化中使用插值, 如下
const string name = "Oleg";
const string greeting = $"Hello, {name}.";
Console.WriteLine(greeting);
// Output: Hello, Oleg.
扩展属性模式
从 C# 10 开始,您可以在适当的模式中引用嵌套的属性或字段, 属性模式变得更具可读性并且需要更少的大括号。
Person person = new()
{
Name = "Oleg",
Location = new() { Country = "PL" }
};
if (person is { Name: "Oleg", Location.Country: "PL" })
{
Console.WriteLine("It's me!");
}
class Person
{
public string Name { get; set; }
public Location Location { get; set; }
}
class Location
{
public string Country { get; set; }
}
如果Location为null,则不会匹配模式并返回false。
文件范围的命名空间
C# 10 引入了一种新的命名空间声明方式 - 文件范围的命名空间,减少一个大括号,代码结构更简洁。
namespace FileScopedNamespace;
class Program
{
static void Main(string[] args)
{
Console.WriteLine("Hello World!");
}
}
全局 Using
一次引用,全局通用
global using System;
global using System.Collections.Generic;
global using System.Linq;
global using System.Threading.Tasks;
List<int> list = new() { 1, 2, 3, 4 };
int sum = list.Sum();
Console.WriteLine(sum);
await Task.Delay(1000);
同一个解构中的赋值和声明
C# 10 可以在同一个解构中进行赋值和声明。
var rgb = (255, 100, 30);
// Initialization & assignment
int r;
(r, int g, int b) = rgb;
Console.WriteLine($"RGB: {r}, {g}, {b}");
// Output: RGB: 255, 100, 30
Record 类型重写 ToString() 时支持密封
Product product = new() { Name = "Bread" };
Console.WriteLine(product.ToString());
// Output: Bread
public record Product
{
public string Name { get; init; }
public sealed override string ToString()
{
return Name;
}
}
Record Struct
C# 10 支持 record struct
Person me = new() { FirstName = "Oleg", LastName = "Kyrylchuk" };
Console.WriteLine(me);
// Output: Person { FirstName = Oleg, LastName = Kyrylchuk }
Person otherPerson = me with { FirstName = "John" };
Console.WriteLine(otherPerson);
// Output: Person { FirstName = John, LastName = Kyrylchuk }
Person anotherMe = new() { FirstName = "Oleg", LastName = "Kyrylchuk" };
C onsole.WriteLine(me == anotherMe);
// Output: True
record struct Person
{
public string FirstName { get; init; }
public string LastName { get; init; }
}
record struct Product(string Name, decimal Price);
Struct 字段支持初始化
using System;
Person person = new() { Name = "Oleg" };
Console.WriteLine(person.Id + " " + person.Name);
// Output: 0cc6caac-d061-4f46-9301-c7cc2a012e47 Oleg
struct Person
{
public Guid Id { get; init; } = Guid.NewGuid();
public string Name { get; set; }
}
Lambda 表达式的 Attributes 支持
C# 9 支持本地函数的 Attributes, C# 10 添加了 Lambda 表达式的 Attributes 支持。
Action a = [MyAttribute] () => { };
Action<int> b =[return: MyAttribute] (x) => { };
Action<int> c =[MyAttribute] ([MyAttribute] x) => { };
class MyAttribute : Attribute
{ }
Lambda 中的显式返回类型
Test<int>();
var l1 = string () => string.Empty;
var l2 = int () => 0;
var l3 = static void () => { };
void Test<T>()
{
var l4 = T () => default;
}
应用于方法的 AsyncMethodBuilder 特性
从 C# 7 开始,您只能将AsyncMethodBuilder 特性应用于类型, 在 C# 10 中,您还可以将该特性应用于单个方法。
using System.Runtime.CompilerServices;
class Example
{
[AsyncMethodBuilder(typeof(AsyncVoidMethodBuilder))]
public void ExampleMethod()
{
}
}
结构体中的表达式
C# 10 支持 将 with 表达式和 struct 一起使用
Product potato = new() { Name = "Potato", Category = "Vegetable" };
Console.WriteLine($"{potato.Name} {potato.Category}");
// Output: Potato Vegetable
Product tomato = potato with { Name = "Tomato" };
Console.WriteLine($"{tomato.Name} {tomato.Category}");
// Output: Tomato Vegetable
struct Product
{
public string Name { get; set; }
public string Category { get; set; }
}
匿名类型中的表达式
C# 10 支持 将 with 表达式和匿名类型一起使用
var potato = new { Name = "Potato", Category = "Vegetable" };
Console.WriteLine($"{potato.Name} {potato.Category}");
// Output: Potato Vegetable
var onion = potato with { Name = "Onion" };
Console.WriteLine($"{onion.Name} {onion.Category}");
// Output: Onion Vegetable

13 个 C# 10 特性的更多相关文章
- 使用FROM确认按钮(键盘13号键)提交特性并使用ajax.POST提交.
如果又想使用FROM确认按钮(键盘13号键)提交特性 还能继续用AJAX.POST提交.就需要使用return false 来阻止FROM默认提交 代码如下: HTML页面 这里最关键就是用了ret ...
- Ubuntu 13.04/12.10安装Oracle 11gR2图文教程(转)
Ubuntu 13.04/12.10安装Oracle 11gR2图文教程 原文标题:How to Install Oracle 11G R2 Enterprise Edition Database U ...
- MIT 6.828 JOS学习笔记13 Exercise 1.10
Lab 1 Exercise 10 为了能够更好的了解在x86上的C程序调用过程的细节,我们首先找到在obj/kern/kern.asm中test_backtrace子程序的地址, 设置断点,并且探讨 ...
- ML.NET 0.10特性简介
IDataView被单独作为一个类库包 IDataView组件为表格式数据提供了非常高效的处理方式,尤其是用于机器学习和高级分析应用.它被设计为可以高效地处理高维数据和大型数据集.并且也适合处理属于更 ...
- ActiveMQ学习笔记(13)----Destination高级特性(一)
1. Wildcards 1. Wildcards用来支持名字分层体系,它不是JMS规范的一部分,是ActiveMQ的扩展. ActiveMQ支持一下三种wildcards: 1. ".&q ...
- dbt 0.13.0 新添加特性sources 试用
dbt 0.13 添加了一个新的功能sources 我呢可以用来做以下事情 从基础模型的源表中进行数据选择 测试对于源数据的假设 计算源数据的freshness source 操作 定义source ...
- 第13月第10天 swift3.0
1. Type 'Any' has no subscript members 这一条简直莫名其妙.大体意思就是,你这个类型"Any"不是个数组或者字典,不能按照下标取东西. 我之前 ...
- mysql 8.0.13 zip windows 10安装
1.下载安装包 https://dev.mysql.com/downloads/mysql/ 下载后解压到D:\Program Files\mysql-8.0.13-winx64 2.添加配置文件my ...
- spark2.0的10个特性介绍
1. Spark 2.0 ! 还记得我们的第七篇 Spark 博文里吗?里面我用三点来总结 spark dataframe 的好处: 当时是主要介绍 spark 里的 dataframe,今天是想总结 ...
随机推荐
- hashtable深度探索
1.什么是哈希表(hashtable)?为什么要发明哈希表? 首先回答第二个问题,在之前的数据结构中我们学习了数组,链表,二叉树等数据结构,记录在结构中的相对位置是随机的,和记录的关键字之前不存在确定 ...
- 一条查询SQL查询语句的执行原理
先熟悉一下浅而易懂SQL执行的流程图SQL查询过程七步曲 1.查询SQL发送请求 客户端将查询sql按照mysql通信协议传输到服务端.服务端接受到请求后,服务端单起一个线程执行sql 2.判断是否为 ...
- linux添加用户、权限
# useradd –d /usr/sam -m sam 此命令创建了一个用户sam,其中-d和-m选项用来为登录名sam产生一个主目录/usr/sam(/usr为默认的用户主目录所在的父目录). 假 ...
- HttpClient连接池设置引发的一次雪崩
事件背景 我在凤巢团队独立搭建和运维的一个高流量的推广实况系统,是通过HttpClient 调用大搜的实况服务.最近经常出现Address already in use (Bind failed)的问 ...
- SpringMVC(2):JSON
一,JSON 介绍 JSON (JavaScript Object Notation, JS 对象简谱) 是一种轻量级的数据交换格式.易于人阅读和编写,同时也易于机器解析和生成,并有效地提升网络传输效 ...
- Windows服务器java.exe占用CPU过高问题分析及解决
最近在测试一个用java语言实现的数据采集接口时发现,接口一旦运行起来,CPU利用率瞬间飙升到85%-95%,一旦停止就恢复到40%以下,这让我不得不面对以前从未关注过的程序性能问题. 在硬着头皮查找 ...
- idea maven 项目 遇到 "Module not specified" 解决方法
1. 原因:我这边出现的原因是 其他同事在提交代码是 将 这个文件夹也提交了,idea 会加载 .idea 里的配置(即 他的配置),而我的 maven 配置不同,导致出错. 2. 解决方法:删除这 ...
- Spring 与 SpringBoot 的区别
概述 Spring 与 SpringBoot 有什么区别???梳理一下 Spring 和 SpringBoot 到底有什么区别,从 Spring 和 SpringBoot 两方面入手. Spring ...
- Mybatis通用Mapper介绍与使用
前言 使用Mybatis的开发者,大多数都会遇到一个问题,就是要写大量的SQL在xml文件中,除了特殊的业务逻辑SQL之外,还有大量结构类似的增删改查SQL.而且,当数据库表结构改动时,对应的所有SQ ...
- 2.ElasticSearch集群的搭建
1.创建elasticsearch-cluster文件夹,在内部复制三个elasticsearch服务 2.修改elasticsearch-cluster\node*\config\elasticse ...