C#10的13个特性
程序员文章站
2022-03-25 08:22:12
常量的内插字符串c# 10 允许使用在常量字符串初始化中使用插值, 如下const string name = "oleg";const string greeting = $"hello, {nam...
常量的内插字符串
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
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。