如何在 C# 12 中使用主构造函数

C# 12 中最引人注目的新功能之一是对主构造函数的支持。主构造函数的概念并不新鲜。包括 Scala、Kotlin 和 OCaml 在内的多种编程语言都支持直接在声明类的位置集成构造函数参数。

在本文中,我们将仔细研究主构造函数以及如何在 C# 12 中使用它们。若要运行本文中提供的代码示例,您应该在系统中安装 Visual Studio 2022。

在 Visual Studio 中创建控制台应用程序项目

首先,让我们在 Visual Studio 中创建一个 .NET Core 控制台应用程序项目。假设您的系统中安装了 Visual Studio 2022,请按照下面概述的步骤创建新的 .NET Core 控制台应用程序。

  1. 启动 Visual Studio IDE。
  2. 单击“创建新项目”。
  3. 在“创建新项目”窗口中,从显示的模板列表中选择“控制台应用程序(.NET Core)”。
  4. 点击下一步。
  5. 在“配置新项目”窗口中,指定新项目的名称和位置。
  6. 点击下一步。
  7. 在接下来显示的“其他信息”窗口中,选择“.NET 8.0(长期支持)”作为您要使用的框架版本。
  8. 单击“创建”。

在本文的后续部分中,我们将使用此 .NET 8 控制台应用程序项目来处理主构造函数。

 

什么是主构造函数?

主构造函数使您能够在类或结构中声明构造函数,并在整个类型主体中使用可用的参数。使用主构造函数,您可以为类或结构创建构造函数,而无需编写代码,即无需显式声明私有数据成员并实现构造函数以将构造函数参数的值分配给这些数据成员。

以下代码片段说明了在结构内声明的主构造函数。

public readonly struct Rectangle(double x, double y)
{//Members of the struct Rectangle
}

下面是在类中声明的主构造函数的简单实现。

public class Rectangle(double x, double y)
{//Members of the class Rectangle
}

主要构造函数参数的作用域为整个类。除了辅助构造函数之外,所有实例成员都可以访问它们。在 C# 中,编译器推断我们需要哪些私有字段并捕获相应的值。

考虑以下代码段,它为名为 Customer 的类实现主构造函数。

public class Customer(int id, string FirstName, string LastName)
{//Implement the class members here
}

与此类相关的属性将使用主构造函数的参数自动初始化。

C# 中主构造函数的优缺点

C# 中的主构造函数具有三个主要优点。

  1. 简化的语法:通过使用主构造函数,您可以直接在构造函数参数中声明和初始化属性,从而减少代码重复。
  2. 轻松初始化:您可以利用主构造函数来使用默认值或作为构造函数参数传递的特定值来初始化类的属性。
  3. 不变性:您可以利用主构造函数中初始化的属性的 init 修饰符,以确保它们在对象初始化后是只读的。

C# 中的主构造函数也有许多缺点。

  1. 灵活性降低:主构造函数设计得很简单,这会限制它们的灵活性。当需要复杂的初始化逻辑或需要额外的操作(例如验证、调度或日志记录)时,它们可能不适合。 
  2. 不太明确的代码:减少样板代码是一个很好的做法,但它也可以使代码不那么明确。缺乏经验的开发人员可能需要帮助来理解属性如何初始化或构造函数如何工作。
  3. 兼容性问题:将主构造函数的新语法无缝集成到现有代码库中可能具有挑战性,特别是在代码库庞大且复杂的情况下。
  4. 对访问修饰符的控制有限:与传统构造函数相比,主构造函数对访问修饰符的控制较少。因此,主构造函数可能不适合需要对可访问性进行细粒度控制的场景。
  5. 学习曲线:由于主构造函数对于 C# 编程语言来说是新的,因此您的开发人员可能需要时间来加快使用它的速度,这可能会减慢项目的开发速度。

在 C# 中使用带有主构造函数的重载构造函数

您可以在任何具有主构造函数的类中使用重载构造函数。以下代码片段说明了如何在具有主构造函数的类中创建多个构造函数。

public class User(int id, string userName, string password)
{//Implement the members of the class here
}// Other members of the class
}

在记录类型中使用主构造函数与在 C# 中使用类

虽然记录和类都支持主构造函数,但行为上存在细微差别。例如,以下是定义使用主构造函数的记录类型的方法:

public record AuthorRecord(int Id, string firstName, string lastName, string address, string phone);

以下是定义使用主构造函数的类的方法:

public record AuthorClass(int Id, string firstName, string lastName, string address, string phone);

您可以创建上述记录类型的实例,如下所示。

var authorRecord = AuthorRecord(int Id, string firstName, string lastName, string address, string phone);

但是,如果您尝试按照下面所示的方式为记录类型的数据成员赋值,您将遇到编译器错误。

authorRecord.Id = 1;

相比之下,您可以创建上述类类型的实例并向其数据成员赋值,如下所示,而不会出现任何编译器错误。

var authorClass = AuthorClass(int Id, string firstName, string lastName, string address, string phone);
authorClass.Id = 1;

在 C# 的主构造函数中使用依赖注入

在 C# 应用程序中实现依赖项注入时,您可以利用主构造函数。让我们通过一个例子来理解这一点。下面的代码说明了如何在 C# 中实现构造函数注入。

public class AuthorService
{private readonly IAuthorRepository _authorRepository;public AuthorService(IAuthorRepository authorRepository){_authorRepository = authorRepository;}public async Task<IEnumerable<Author>> GetAll(){return await _authorRepository.GetAll();}
}

最后,请注意如何使用主构造函数使代码更加清晰,如下面的代码所示。

public class AuthorService (IAuthorRepository authorRepository)
{public async Task<IEnumerable<Author>> GetAll(){return await authorRepository.GetAll();}
}

尽管主构造函数最初是在 C# 9 中引入的,但它们仅限于记录类型。使用 C# 12,您可以在记录类型、类和结构中使用主构造函数,帮助您编写更清晰、更简洁的样板代码。


作者:Joydip Kanjilal​

更多技术干货请关注公号【云原生数据库

squids.cn,云数据库RDS,迁移工具DBMotion,云备份DBTwin等数据库生态工具。

irds.cn,多数据库管理平台(私有云)。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/600598.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

即插即用篇 | YOLOv8 Gradio 前端展示页面 | 支持 【分类】【检测】【分割】【关键点】 任务

分类任务效果 分割任务效果 检测任务效果 关键点任务效果 使用方法 Gradio 是一个开源库,旨在为机器学习模型提供快速且易于使用的网页界面。它允许开发者和研究人员轻松地为他们的模型创建交互式的演示,使得无论技术背景如何的人都可以方便地试用和理解这些模型。使用Gradi…

【BCC动态跟踪PostgreSQL】

BPF Compiler Collection (BCC)是基于eBPF的Linux内核分析、跟踪、网络监控工具。其源码存放于GitCode - 开发者的代码家园 想要监控PostgreSQL数据库的相关SQL需要在编译PostgreSQL的时候开启dtrace。下文主要介绍几个和PostgreSQL相关的工具,其他工具可根据需求自行了解。 …

【QT 自研上位机 与 ESP32下位机联调>>>串口控制GPIO-基础样例-联合文章】

【QT 自研上位机 与 ESP32下位机联调&#xff1e;&#xff1e;&#xff1e;串口控制GPIO-基础样例-联合文章】 1、概述2、实验环境3、 自我总结4、 实验过程1、验证上位机QT程序1、下载样例代码2、修改qt程序3、运行测试验证 2、验证下位机ESP32程序1、下载样例代码2、更改ESP3…

55.网游逆向分析与插件开发-游戏增加自动化助手接口-自动药水设定功能的逆向分析

内容来源于&#xff1a;易道云信息技术研究院VIP课 上一个内容&#xff1a;项目需求与需求拆解-CSDN博客 之前在找到过一个虚函数&#xff0c;每个按钮的都有一个实现机制&#xff0c;参考这里游戏结束过程的逆向分析 实际上找起来会不会用上不知道&#xff0c;接下来开始逆…

go语言 json marshal和unmarshal序列化字节切片和反序列化对象

json.Marshal 和 json.Unmarshal 是 Go 语言标准库中用于 JSON 编码和解码的函数。 - json.Marshal 用于将 Go 对象转换为 JSON 格式的字节切片。 go package main import ( "encoding/json" "fmt" ) type Person struct { Name string json:"name&qu…

二维码地址门牌系统技术服务:让您的生活更便捷,一码通行,安全无忧

文章目录 前言一、融合二维码技术与门牌的便捷服务二、手机开门便捷功能三、智能化安全保障四、智能化、便捷化的新型技术 前言 在数字化时代&#xff0c;二维码门牌系统技术应运而生&#xff0c;为了满足人们对安全、便捷生活的需求。这项技术将二维码与门牌结合&#xff0c;…

2019数据结构----队列真题

(1)允许增加空间&#xff0c;空间可以改变所以是通过链表,链式存储实现的&#xff1b;占用的空间可以重复使用&#xff0c;所以是循环队列。 (2)队空&#xff1a;frontrear;队满&#xff1a;frontrear->next

CNAS中兴新支点——什么是安全测试,安全测试报告有什么作用,主要测试哪些内容?

1.安全测试在做什么&#xff1f; 扫描&#xff1f;在很多人眼中&#xff0c;做安全的就是整天那个工具在哪里扫描操作&#xff0c;使用各种不同的工具做扫描。 是的&#xff0c;扫描是安全测试很重要的一部分&#xff0c;扫描可快速有效发现问题。扫描工具的易用性&#xff0…

霍尔传感器测速测距实验——STM32驱动(课程设计)

———————实验效果——————— &#x1f384;图片演示测距 &#x1f384;视频演示测速 基于STM32单片机 霍尔传感器测速度&#xff0c;测圈数 &#x1f384;模块介绍 测距使用HC-SR04模块 测距使用测速使用霍尔传感器 ———————代码获取查看下方———————…

商务智能|描述性统计分析与数据可视化

一、商务智能的三大方面 三个主要方面是描述性的统计分析、预测性的分析和指导性的数据分析。 A. 商务智能的知识体系下,数据分析包含了哪三个工作?商务智能体系架构里边关于数据分析的术语是什么? 商务智能的知识体系下,数据分析包含了三个工作,即描述性分析,预测性分析…

Mac Parallels19.1.0 Install CentOS7.9

0、资源准备 # centos7.9镜像一份 链接: https://pan.baidu.com/s/1acIjUnsTGhk_2cYCZLSoGg?pwd6666 提取码: 6666 --来自百度网盘超级会员v7的分享1、打开PD 2、选择镜像进行安装 指定镜像名称 创建 进行密码设置 安装目的地点开后直接点击完成 网络和主机名称 开…

编程语言的生命力

一、目前主流的编程语言 目前流行的编程语言有很多种&#xff0c;可谓是百花齐放、百家争鸣。根据不同的应用场景和领域&#xff0c;有不同的编程语言被广泛使用。一些目前主流的编程语言HTML5、Python、JavaScript 、Java 、C 、PHP 、Swift 等等。 还有许多其他的编程语言&am…

xcode-开发相关

分发方式 下面是指应用程序分发方法&#xff0c;决定了你可以将app安装到哪些设备以及应用可以使用哪些功能 每个分发模式对应的provision profile不同 debug release ad hoc(临时分发) 允许100台指定的移动设备&#xff0c;这种分发不会将应用发布到App Store&#xff0c…

使用国内镜像源来安装 Golang 包:

使用国内镜像源来安装 Golang 包&#xff1a; 阿里云&#xff1a;https://mirrors.aliyun.com/goproxy/ 要使用这些镜像源&#xff0c;请将 GOPROXY 环境变量设置为所选镜像源的 URL。例如&#xff0c;要使用阿里云镜像源&#xff0c;请在命令行中运行以下命令&#xff1a; …

Java SE面试

1.什么是 Java&#xff1f; Java 是一门面向对象的编程语言&#xff0c;不仅吸收了 C语言的各种优点&#xff0c;还摒弃了 C里难以理解的多继承、指针等概念&#xff0c;因此 Java 语言具有功能强大和简单易用两个特征。Java 语言作为静态面向对象编程语言的优秀代表&#xff…

麒麟系统U盘安装

U盘安装盘制作 方法一 (仅适用于龙芯桌面V5.0) 准备U盘&#xff1a; 推荐使用fat32 (vfat) 格式的U盘&#xff1b;把整个系统镜像 XXX.iso 复制到U盘下面&#xff1b;把镜像XXX.iso 挂载起来&#xff0c;然后复制镜像中的boot文件夹和ks.cfg 到U盘根目录&#xff1b;复制镜像中…

Qt 6之四:基础概念讲解

Qt 6之四&#xff1a;基础概念讲解 Qt是一种跨平台的C应用程序开发框架&#xff0c;它提供了一套丰富的工具和库&#xff0c;可以帮助开发者快速构建跨平台的应用程序&#xff0c;用于开发图形用户界面&#xff08;GUI&#xff09;和非GUI应用程序。 Qt 6之一&#xff1a;简介…

Python小细节之Gui图形化界面库tkinter学习

敲打计数脚本学TKinter 引言开整选择决定难易了解她使用她运行效果 结尾 引言 我的爬取表情包的爬虫文件写好了 运行 输入关键词就可以得到对应的 表情包 我也通过pyinstall 打包了 但是很丑 就只有一个黑box 我是新手 所以我知道 这对于普通人来说 不友好 且在使用的过程中 …

C++ 具名要求-布局

此页面中列出的具名要求&#xff0c;是 C 标准的规范性文本中使用的具名要求&#xff0c;用于定义标准库的期待。 某些具名要求在 C20 中正在以概念语言特性进行形式化。在那之前&#xff0c;确保以满足这些要求的模板实参实例化标准库模板是程序员的重担。若不这么做&#xf…

Pendulum详解4——Pendulum在数据挖掘中的威力 - 时间的宝藏

写在开头 在这个数字化时代,时间数据无处不在,而它往往蕴含着丰富的信息。然而,在数据挖掘中,我们经常需要处理不同时间维度的数据,从而更好地理解和预测各种现象。Pendulum库的引入为我们提供了一种简洁而强大的工具,可以更好地处理和分析时间数据。 1. 集聚分析 地理…