大家还记得记录(record)类型吗?记录类型很像一个构造函数,那么类可以像record类型一样使用吗?C#12就推出了这样的功能,这就是主构造函数。“现在可以在任何 class
和 struct
中创建主构造函数。主构造函数不再局限于 record
类型。主构造函数参数都在类的整个主体的范围内。为了确保显式分配所有主构造函数参数,所有显式声明的构造函数都必须使用 this()
语法调用主构造函数。将主构造函数添加到 class
可防止编译器声明隐式无参数构造函数。在struct
中,隐式无参数构造函数初始化所有字段,包括 0 位模式的主构造函数参数。”下面将介绍主构造函数的语法和相关使用场景。
语法
当然要使用主构造函数必须是运行 .NET 8 或更高版本,包括 C# 12 或更高版本编译器。它的语法跟record类似。如下:
class?ClassName(int?a,?string?b)
{
// 构造函数体
}
在这里,int a
和string b
是主构造函数的参数。注意,参数列表直接跟在类名之后,使用括号括起。如果主构造函数不需要额外逻辑,甚至可以省略显式构造函数体。
同样,结构体也可以用类似的方式定义主构造函数,如下:
struct StructName(int a, string b)
{
// 构造函数体
}
先来使用一下主构造函数初始化属性的案例。如下:
public readonly struct calculate(double a, double b)
{
public readonly double Add{ get; } =a+b;
public readonly double Sub { get; } = a - b;
}
以上代码演示了用于初始化计算的只读属性的主构造函数。 Add和 Sub的字段初始值设定项使用主构造函数参数。主构造函数参数不会在结构中的其他任何位置使用。前面的结构就像编写了以下代码一样:
public readonly struct calculate
{
public readonly double Add{ get; };
public readonly double Sub { get; } ;
????????public calculate(double a, double b)
????????{
???????? Add= =a+b;
????????}
}
从上面的代码可以看出,第一种写法比第二种写法更简洁明了,可读性强。
依赖注入也是比较常用的语法,尤其是通过构造函数进行依赖关系的注入,下面我们通过主函数的方式实现控制台中的构造函数注入。代码如下:
[ApiController]
[Route("[controller]")]
public class WeatherForecastController(ILogger<WeatherForecastController> logger) : ControllerBase
{
private readonly ILogger<WeatherForecastController> _logger=logger;
[HttpGet(Name = "GetWeatherForecast")]
public IEnumerable<WeatherForecast> Get()
{
logger.LogDebug("测试!");
return null;
}
}
以上代码是改造asp.net?core最小API的默认项目案例测试主构造函数,这样写的话代码简洁多了。
结语
主构造函数是 C# 12 引入的一个比较实用的新特性,为我们提供了更简洁和灵活的方式来定义类和结构体的构造函数。这一新特性将在日常开发中提高代码的可读性和开发效率。本文讲述了C#12的新特性主构造函数的语法以及依赖关系注入和初始化属性的案例,当然主构造函数还可以创建可变状态、初始化基类等,详情可以查看官网。大家觉得C#12的新特主构造函数实用吗?欢迎留言讨论或者吐槽。
参考:learn.microsoft.com/zh-cn/dotnet/csharp/whats-new/tutorials/primary-constructors
来源公众号:DotNet开发跳槽????