有哪些竞价网站,网站备案类型有哪些,自己做的网站可以运营不,wordpress 输出array上次写完 C# 10#xff0c;有兄弟在后台问 C# 9#xff0c;就再开个篇写一写。C# 9#xff0c;对应的是 Dotnet 5.0。这个出来也有些日子了#xff0c;不过好像群里很多人还是没往这个版本走。我这边现在是全线已经转向了 5.0#xff0c;还是我经常说的那个原因#xff1… 上次写完 C# 10有兄弟在后台问 C# 9就再开个篇写一写。C# 9对应的是 Dotnet 5.0。这个出来也有些日子了不过好像群里很多人还是没往这个版本走。我这边现在是全线已经转向了 5.0还是我经常说的那个原因爽。Dotnet 的每一次升级都有一些让人惊喜的特性让代码更合理更节省时间。1. 基础语言方面语言方面最主要的特性是 Record。这是 C# 9 出来的一个新数据类型。没错Record 是一个数据类型。这个 Record 提供了一些很爽的表示数据的内置功能以至于使用的时候感觉它更像一个类。按微软的说法Record 的目的是提供一个更小更简单的类型来表示不可变数据。不过在使用中我更喜欢用它来做数据传输。定义一个 Record定义一个 Record 有几种方式。最简单的形式是public record User( string name, int age );第一次看这个东西会有点奇怪有没有长得有点像方法可就没内容。嗯这确实是 Record 的一个声明定义定义了一个对象 user这个对象 user 具有 name 和 age 两个属性。可以通过以下方式来访问var some_user new User ( WangPlus, 35 );
Console.WriteLine( some_user.name ); //输出 WangPlus
Console.WriteLine( some_user.age ); //输出 35确实跟类有点像。再来看看另一种定义方式会更像一个类public record User
{public string name { get; set; }public int age { get; set; }
}给 Record 赋值既然长得像类我们可以像类一样去赋值var some_user new User { name WangPlus, age 35 };还可以用位置语法近一步简化User some_user new ( WangPlus, 35 );注意这个位置语法其实就是按位置匹配字段的意思。赋值时的值会自动去找对应位置的属性来匹配和校验。而且对于第一种简单定义public record User( string name, int age );赋值语句实际编译时上面字段中的 set 会被替换为 init即public record User
{public string name { get; init; }public int age { get; init; }
}这意味着属性在初始化后无法改变会变成只读属性。相等判断Record 对于相等的定义是内部的属性相等。也就是说判断两个 Record 是否相等时将检查每个属性的值而不是对象的引用地址。看例子User some_user1 new (WangPlus, 35);
User some_user2 new (WangPlus, 35);
Console.WriteLine(some_user1 some_user2); // true
Console.WriteLine(ReferenceEquals(some_user1, some_user2)); // false例子中some_user1 和 some_user2 属性相同所以他们是相等的尽管是两个不同的引用。不一样的 ToString()Record 的 ToString 是一个内置方法跟别的对象的 ToString 有很大区别。它会把 Record 的定义、属性和值全部输出。上面的例子输出的内容将会是User { name WangPlus, age 35 }注意如果某个 Record 的属性是引用类型ToString 将会输出这个类型的名称。Record 值的传递这个内容延续到了 C# 10相关内容我在 「Dotnet 6.0你值得拥有」里有详细的描述可以去看看。这里简单说一下就是使用 WithUser some_user new ( WangPlus, 35 );
User other_user some_user with { name WangPlus1 };定义 Init 属性C# 9 里新增了一个对于属性定义的 init 关键字。这个关键字可以用在 Struct、Class、Record 中表示属性仅在初始化时可以进行设置。例如public record User
{public string name { get; set; }public int age { get; init; }
}这里age 属性被定义为 init。赋值还是一样的User some_user new ( WangPlus, 35 );当改变值时例如some_user.name WangPlus1;这个是有效的但是some_user.age 36;这句话会报错因为在上面定义中age 被定义为 init即只有初始化时可以赋值。以上是 C# 9 中增加的最重要的一个内容Record 类型。2. API 方面API 方面主要是三个特性。1. 顶级程序这算是大家盼了很久的一个特性。早期一个程序的开始会是这个样子using System;namespace Demo
{static class Program{static void Main(string[] args){Console.WriteLine(Hello World!);}}
}现在有了顶级程序的规则这一大段可以直接简化为System.Console.WriteLine(Hello World);就OK了。Program 啦Main 啦统统都可以不写了。对于 WebAPI 应用也一样using Microsoft.AspNetCore.Hosting;
using Microsoft.Extensions.Hosting;namespace Demo
{public class Program{public static void Main(string[] args){CreateHostBuilder(args).Build().Run();}public static IHostBuilder CreateHostBuilder(string[] args) Host.CreateDefaultBuilder(args).ConfigureWebHostDefaults(webBuilder {webBuilder.UseStartupStartup();});}
}这是一个标准的 WebAPI 应用的开始。现在也可以简化成using Microsoft.AspNetCore.Hosting;
using Microsoft.Extensions.Hosting;CreateHostBuilder(args).Build().Run();IHostBuilder CreateHostBuilder(string[] args) Host.CreateDefaultBuilder(args).ConfigureWebHostDefaults(webBuilder {webBuilder.UseStartupStartup();});这样的代码其实更简洁而且可以直观的说明程序的意图。如果你也经常写 Python那你会很喜欢这个特性。2. 新的匹配模式C# 9 里终于加入了大家期盼已久的新的匹配模式。主要有两类第一类逻辑匹配这个主要是加入了 And、Or 和 Not。以前我们会用到这样的判断if( input null ) {}有时候我们也会写成if( input is null ) {}但是判断不等于时我们只有一种方式就是if( input ! null ) {}现在我们有了更可读的写法if( int is not null ) {}看起来可读性就很高了。第二类关系匹配这个特性涉及的是 、、、最主要的是改变了 Switch。以前使用 Switch 时Case 必须是可枚举的值看例子switch( input )
{case 1:break;case 2:break;default:break;
}现在这里面加入了范围判断可以这么写switch( input )
{case 5:break;case 5 and 9:break;default:break;
}看到没更多的逻辑可以在 Switch 里实现而不用一大篇 if…else 了。3. 类型省略这个特性涉及到代码的方方面面主要的目的是为了减少代码的输入量。看个例子以前我们定义一个字段通常是这样public ListUser users new ListUser();现在我们可以直接省略后面的部分编译器会很聪明的知道我们想 New 什么public ListUser users new ();方法也是一样。假设我们有一个方法public static class Users
{public User copyUser(User source) {}
}以前调用时我们需要先给个变量再调用方法User source_user new User();
Users.copyUser( source_user );现在我们可以在方法中直接 NewUsers.copyUser( new () );当然这个特性也结合了上面 Record 的特性。因此我们还可以这么写Users.copyUser( new () { name WangPlus } );嗯语庋的改变需要一点时间来适应但从长远来看依然是一种进步会让代码更方便写和读。同时这个特性和 Var 会变成编程的两个面哪个更好用看自己的习惯了。3. 总结总的来说Dotnet 5.0 的变化还是有很多惊喜的。上面写的只是我们能比较容易感受到的部分感受不到的部分比方编译的合理性、性能的优化GC的回收做得都相当优秀。早转 5.0 早好对吧喜欢就来个三连让更多人因你而受益