C#12新功能主构造函数:实用,简洁利落

大家还记得记录(record)类型吗?记录类型很像一个构造函数,那么类可以像record类型一样使用吗?C#12就推出了这样的功能,这就是主构造函数。“现在可以在任何 classstruct 中创建主构造函数。主构造函数不再局限于 record 类型。主构造函数参数都在类的整个主体的范围内。为了确保显式分配所有主构造函数参数,所有显式声明的构造函数都必须使用 this() 语法调用主构造函数。将主构造函数添加到 class 可防止编译器声明隐式无参数构造函数。在struct中,隐式无参数构造函数初始化所有字段,包括 0 位模式的主构造函数参数。”下面将介绍主构造函数的语法和相关使用场景。

语法

当然要使用主构造函数必须是运行 .NET 8 或更高版本,包括 C# 12 或更高版本编译器。它的语法跟record类似。如下:

class ClassName(int a, string b)
{
    // 构造函数体
}

在这里,int astring 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开发跳槽    
posted @ 2024-01-08 08:44  翔星  阅读(1247)  评论(0编辑  收藏  举报