2021年4月19日,微软宣布将于今年夏天发布首款64位Visual Studio 2022,2021年5月20日发布Visual Studio 2022电路图,进一步提升开发生产力。C#语言,Visual Studio的黄金搭档,一直是秒、天、秒、秒空气的存在。C#10,今天就要来了。
本周早些时候(2021年5月1日),我关注了Mads Torgersen在DotNet SouthWest的一次演讲。他是微软C#语言的首席设计师。他概述了C#10将包含的新的很酷的特性。让我们一起快速预览一下。
记录结构
他谈到的第一件事是记录的当前实现使用引用类型作为基础对象。C#10中将提供一个记录结构,它的基本类型可以是值类型。不同之处在于,常规记录将通过引用从一个函数传递到另一个函数,而记录结构将通过其值进行复制。记录结构也将支持表达式。
同时,还可以添加操作员进行记录。两种记录类型都可以使用。
记录人员(字符串名称、字符串电子邮件)
{
公共静态人员操作员(人员优先,人员优先)
{
//TODO业务逻辑
}
}必需的属性
C#团队的目标之一是使对象的初始化更加容易。这就是为什么您可以根据需要将所需的属性标记添加到类、结构、记录或记录结构中。它强制要求必须为这些属性赋值。这可以通过构造函数或对象初始化来完成。以下两个类定义是等价的。如果使用必需的关键字编写,则在没有设置名称属性的情况下,无法实例化人员。编译器引发错误,无法编译。
类人
{
公共必需字符串名称{ get设置;}
公共DateTime DateOfBirth { get设置;}
}
类人
{
公众人物(字符串名称)=姓名=姓名;
公共字符串名称{ get设置;}
公共DateTime DateOfBirth { get设置;}
}字段特征
为了进一步提高性能,我们可以完全去掉背场。新的关键字字段将提供对支持字段的访问。它可以用于setter和init only属性。
类人
{
公共字符串名称{ getinit=字段=值。trim();}
公共DateTime DateOfBirth { getset=field=value。日期;}
}带表情
下一个版本也会有一些漂亮的小改进。其中之一是with运算符也将支持匿名类型。
var foo=new
{
名称='Foo ',
Email='foo@mail.com '
};
var bar=foo,带{ Name=' Bar ' };命名空间
现在,您可以创建一个文件,在其中可以在任何地方使用命名空间导入。例如,如果您在几乎每个文件中都使用一个公共命名空间,例如Microsoft。您可以使用Microsoft添加全局命名空间。extensions.logging.ilogger到任何。cs文件(我建议使用Program.cs或者专用的Imports.cs),可以在整个项目中使用logger接口。然而,这种方法并不适用于整个解决方案。因为没有人可以预测导入到哪里,所以它们被按项目分组到每个项目中。
随后,命名空间也将得到优化。现在命名空间需要
花括号 {} 来对代码进行分组,这意味着所有代码至少要缩进一次。为了节省 tab(或四个空格)和屏幕空间,在文件中的任何位置添加一个 namespace,将使所有代码都属于该namespace。有相关研究表明绝大多数情况下,一个文件中的几乎所有代码都属于同一个 namespace。使用该方案优化后,文件大小会减小,这对于一个解决方案(即使它包含数千个文件)来说可能并不重要,但在 GitHub/GitLab/BitBucket/...的规模上,我认为这将为他们节省一些空间。如果有人仍想在一个文件中包含多个命名空间,则仍然可以选择使用大括号。// 传统方式 LegacyNamespace.cs namespace LegacyNamespace { class Foo { // ToDo 业务逻辑 } } // 简化后的方式 SimplifiedNamespace.cs namespace SimplifiedNamespace; class Bar { // ToDo 业务逻辑 }lambda 表达式
lambda 语句也有一些很酷的更新。编译器将更好地支持推断 lambda 签名,并且还可以添加属性。可以指定显式返回类型以帮助编译器理解 lambda。
var f = Console.WriteLine; var f = x => x; // 推断返回类型 var f = (string x) => x; // 推断签名 var f = [NotNull] x => x; // 在属性上添加特性 var f = [NotNull] (int x) => x; var f = [return: NotNull] static x => x; // 为返回类型添加特性 var f = T () => default; // 显示返回类型 var f = ref int (ref int x) => ref x; // 在 struct 上使用 ref 关键字 var f = int (x) => x; // 显式指定隐式输入的返回类型 var f = static void (_) => Console.Write("Help");interface接口
最后,可以在接口上指定静态方法和属性。我知道这将是一个有争议的话题,就像向接口添加默认实现一样。虽然我不喜欢它,然而这可能非常有趣。想象一下,您可以指定接口的默认值或指定创建方法。
interface IFoo { static IFoo Empty { get; } static operator +(IFoo first, IFoo second); } class Foo : IFoo { public static IFoo Empty => new Foo(); public static operator +(IFoo first, IFoo second) => /* 在此做逻辑计算 */; }就个人而言,我喜欢这些变化。尤其是 namespace 和 interface 的变化和改进。不管怎样,C#的未来是光明的。
系列内容:Visual Studio 2022、.NET Core、.NET5、.NET6、C#、C#10
#奇才力克76人避免横扫 恩比德伤退#
#三孩生育政策配套支持措施来了#
#叙利亚足协:不同意为中国队改赛程#
#三孩生育政策配套支持措施来了#
#成年人的快乐六一#