.NET Conf 2022 在昨晚(11月8日) 11 点 正式开始了,为期三天的会议(11月8-10日), 围绕 .NET 7 展开。 相信各位小伙伴都已经开始安装 .NET 7 正式版本还有以及相关的开发工具。这次 .NET 7 围绕传统的 C# , ASP.NET Core , Blazor , .NET MAUI , 云原生等内容进行了更新。下面归类总结一下我比较关心的更新内容,希望能给各位小伙伴一个快速的介绍。
C# 11 新增的六大功能
1. 泛型属性 - Generic attributes
泛型是编程语言的一种风格。让程序员在强类型程序设计语言中编写代码使用一些以后才指定的类型。C# 在 2.0 开始支持泛型,C# 版本更替时不断对泛型的支持进行了增强和补充。在 C# 11 中,增加了泛型属性。
这是一段 ASP.NET 的代码,每个字段都有一些要求属性,如必填的字段,限制范围,以及对应的类型等
public class Movie
{
public int Id { get; set; }
[Required]
[StringLength(100)]
public string Title { get; set; } = null!;
[ClassicMovie(1960)]
[DataType(DataType.Date)]
[Display(Name = "Release Date")]
public DateTime ReleaseDate { get; set; }
[Required]
[StringLength(1000)]
public string Description { get; set; } = null!;
[Range(0, 999.99)]
public decimal Price { get; set; }
public Genre Genre { get; set; }
public bool Preorder { get; set; }
}
你可以通过 System.Attribute 派生出不同的属性。
在 C# 11 之前你也可以去做泛型属性的定义,通过 System.Type 在自定义属性类中作为构造函数的参数进行传递
[AttributeUsage(AttributeTargets.Class)]
public class Conditions: Attribute
{
public Conditions(Type t)
{
ParamType = t;
}
public Type ParamType { get; }
}
实现
[Conditions(typeof(string))]
public class Player
{
public string Number { get; set; }
public string Name { get; set; }
}
而 C# 11 增加了对泛型属性的支持。 直接定义一个泛型类,不用再将 System.Type 作为参数传递给构造函数。 而且可以有一个或者多个类型作为参数, 而且类型安全性也增加了
[AttributeUsage(AttributeTargets.Class)]
public class Conditions<T>: Attribute
where T : class
{
public Conditions()
{
}
public T ParamType { get; }
}
[Conditions<string>()]
public class Player
{
public string Number { get; set; }
public string Name { get; set; }
}
因为有了泛型类的加持,您可以在类型参数上灵活添加不同的条件约束。
2. 原始字符串 - New Raw string literals
在定义字符串时,我们往往夹杂着很多的符号,换行还有空格,但过往这些都需要增加转移字符,但现在通过原始字符串可以让字符串定义更为简单,也更容易给人接受
string longMessage = """
This is a long message.
It has several lines.
Some are indented
more