大家還記得記錄(record)類型嗎?記錄類型很像一個(gè)構(gòu)造函數(shù),那么類可以像record類型一樣使用嗎?C#12就推出了這樣的功能,這就是主構(gòu)造函數(shù)。“現(xiàn)在可以在任何 class
和 struct
中創(chuàng)建主構(gòu)造函數(shù)。主構(gòu)造函數(shù)不再局限于 record
類型。主構(gòu)造函數(shù)參數(shù)都在類的整個(gè)主體的范圍內(nèi)。為了確保顯式分配所有主構(gòu)造函數(shù)參數(shù),所有顯式聲明的構(gòu)造函數(shù)都必須使用 this()
語(yǔ)法調(diào)用主構(gòu)造函數(shù)。將主構(gòu)造函數(shù)添加到 class
可防止編譯器聲明隱式無(wú)參數(shù)構(gòu)造函數(shù)。在struct
中,隱式無(wú)參數(shù)構(gòu)造函數(shù)初始化所有字段,包括 0 位模式的主構(gòu)造函數(shù)參數(shù)?!毕旅鎸⒔榻B主構(gòu)造函數(shù)的語(yǔ)法和相關(guān)使用場(chǎng)景。
語(yǔ)法
當(dāng)然要使用主構(gòu)造函數(shù)必須是運(yùn)行 .NET 8 或更高版本,包括 C# 12 或更高版本編譯器。它的語(yǔ)法跟record類似。如下:
class?ClassName(int?a,?string?b)
{
// 構(gòu)造函數(shù)體
}
在這里,int a
和string b
是主構(gòu)造函數(shù)的參數(shù)。注意,參數(shù)列表直接跟在類名之后,使用括號(hào)括起。如果主構(gòu)造函數(shù)不需要額外邏輯,甚至可以省略顯式構(gòu)造函數(shù)體。
同樣,結(jié)構(gòu)體也可以用類似的方式定義主構(gòu)造函數(shù),如下:
struct StructName(int a, string b)
{
// 構(gòu)造函數(shù)體
}
初始化屬性
先來(lái)使用一下主構(gòu)造函數(shù)初始化屬性的案例。如下:
public readonly struct calculate(double a, double b)
{
public readonly double Add{ get; } =a+b;
public readonly double Sub { get; } = a - b;
}
以上代碼演示了用于初始化計(jì)算的只讀屬性的主構(gòu)造函數(shù)。 Add和 Sub的字段初始值設(shè)定項(xiàng)使用主構(gòu)造函數(shù)參數(shù)。主構(gòu)造函數(shù)參數(shù)不會(huì)在結(jié)構(gòu)中的其他任何位置使用。前面的結(jié)構(gòu)就像編寫了以下代碼一樣:
public readonly struct calculate
{
public readonly double Add{ get; };
public readonly double Sub { get; } ;
????????public calculate(double a, double b)
????????{
???????? Add= =a+b;
????????}
}
從上面的代碼可以看出,第一種寫法比第二種寫法更簡(jiǎn)潔明了,可讀性強(qiáng)。
依賴關(guān)系注入
依賴注入也是比較常用的語(yǔ)法,尤其是通過(guò)構(gòu)造函數(shù)進(jìn)行依賴關(guān)系的注入,下面我們通過(guò)主函數(shù)的方式實(shí)現(xiàn)控制臺(tái)中的構(gòu)造函數(shù)注入。代碼如下:
[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("測(cè)試!");
return null;
}
}
以上代碼是改造asp.net?core最小API的默認(rèn)項(xiàng)目案例測(cè)試主構(gòu)造函數(shù),這樣寫的話代碼簡(jiǎn)潔多了。
結(jié)語(yǔ)
主構(gòu)造函數(shù)是 C# 12 引入的一個(gè)比較實(shí)用的新特性,為我們提供了更簡(jiǎn)潔和靈活的方式來(lái)定義類和結(jié)構(gòu)體的構(gòu)造函數(shù)。這一新特性將在日常開(kāi)發(fā)中提高代碼的可讀性和開(kāi)發(fā)效率。本文講述了C#12的新特性主構(gòu)造函數(shù)的語(yǔ)法以及依賴關(guān)系注入和初始化屬性的案例,當(dāng)然主構(gòu)造函數(shù)還可以創(chuàng)建可變狀態(tài)、初始化基類等,詳情可以查看官網(wǎng)。大家覺(jué)得C#12的新特主構(gòu)造函數(shù)實(shí)用嗎?歡迎留言討論或者吐槽。文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-777112.html
參考:learn.microsoft.com/zh-cn/dotnet/csharp/whats-new/tutorials/primary-constructors文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-777112.html
來(lái)源公眾號(hào):DotNet開(kāi)發(fā)跳槽????
到了這里,關(guān)于C#12新功能主構(gòu)造函數(shù):實(shí)用,簡(jiǎn)潔利落的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!