当前位置: 首页 > news >正文

如何在 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,多数据库管理平台(私有云)。

相关文章:

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

C# 12 中最引人注目的新功能之一是对主构造函数的支持。主构造函数的概念并不新鲜。包括 Scala、Kotlin 和 OCaml 在内的多种编程语言都支持直接在声明类的位置集成构造函数参数。 在本文中&#xff0c;我们将仔细研究主构造函数以及如何在 C# 12 中使用它们。若要运行本文中提…...

Zookeeper之Java客户端实战

ZooKeeper应用的开发主要通过Java客户端API去连接和操作ZooKeeper集群。可供选择的Java客户端API有&#xff1a; ZooKeeper官方的Java客户端API。第三方的Java客户端API&#xff0c;比如Curator。 接下来我们将逐一学习一下这两个java客户端是如何操作zookeeper的。 1. ZooKe…...

将文本文件导入Oracle数据库的简便方法:SQL Loader Express

需求 我有一个文本文件dbim.txt&#xff0c;是通过alert log生成的&#xff0c;内容如下&#xff1a; 2020-09-11 2020-09-11 ... 2023-12-03 2023-12-03 2023-12-26我已经在Oracle数据库中建立了目标表&#xff1a; create table dbim(a varchar(16));我想把日志文件导入Or…...

element-ui table-自定义表格某列的表头样式或者功能

自带表格 自定义表格某列的表头样式或者功能 <el-table><el-table-column :prop"date">//自定义表身每行数据<template slot-scope"scope">{{scope.row[scope.column.label] - ? - : scope.row[scope.column.label]}}</template>…...

Android 13.0 SystemUI状态栏居中显示时间和修改时间显示样式

1.概述 在13.0的系统rom定制化开发中,在systemui状态栏系统时间默认显示在左边和通知显示在一起,但是客户想修改显示位置,想显示在中间,所以就要修改SystemUI 的Clock.java 文件这个就是管理显示时间的,居中显示的话就得修改布局文件了 效果图如下: 2.SystemUI状态栏居中显…...

讲解eureca和nacus的区别

Eureca和Nacus都是远程过程调用&#xff08;RPC&#xff09;框架&#xff0c;用于实现分布式系统中不同节点之间的通信。它们之间的主要区别如下&#xff1a; 架构设计&#xff1a;Eureca是一个基于JavaScript的RPC框架&#xff0c;它使用了WebSockets作为传输层协议。Eureca C…...

python中parsel模块的css解析

一、爬虫页面分类 1.想要爬取的内容全部在标签中&#xff0c;可以使用xpath去进行解析如下图 2.想要爬取的内容呈现json的数据特征&#xff0c;用.json()转换为字典格式 3.页面不规则&#xff0c;标签中包含大括号&#xff0c;如下面想要获取键值内容怎么做&#xff0c;先用re正…...

Oracle OCP怎么样线上考试呢

大家好&#xff01;今天咱们就来聊聊Oracle OCP这个让人又爱又恨的认证。为啥说又爱又恨呢&#xff1f;因为它既是IT界的“金字招牌”&#xff0c;又是一块硬骨头&#xff0c;不是那么容易啃下来的。好了&#xff0c;废话不多说&#xff0c;我们直奔主题&#xff0c;来看看关于…...

如何让自己的写的程序在阿里云一直运行

购买了阿里云服务器后&#xff0c;每次要用自己写在阿里云的服务器程序都要连接到云端 然后./运行该程序&#xff0c;而且每次一断开终端&#xff0c;该服务器就会自动停止&#xff0c;这样使用相当麻烦。那怎样才能让我们的服务器一直在云端后台运行&#xff0c;即便退出终端…...

【计算机图形学】NAP: Neural 3D Articulation Prior

文章目录 1. 这篇论文做了什么事&#xff0c;有什么贡献&#xff1f;2. Related Work铰接物体建模3D中的Diffusion model扩散模型 3. Pipeline铰接树参数化基于Diffusion的铰接树生成去噪网络 4. 实验评价铰接物体生成——以往做法与本文提出的新指标NAP捕捉到的铰接物体分布质…...

知识付费平台搭建?找明理信息科技,专业且高效

明理信息科技知识付费saas租户平台 在当今数字化时代&#xff0c;知识付费已经成为一种趋势&#xff0c;越来越多的人愿意为有价值的知识付费。然而&#xff0c;公共知识付费平台虽然内容丰富&#xff0c;但难以满足个人或企业个性化的需求和品牌打造。同时&#xff0c;开发和…...

CentOS7部署Kafka

CentOS7部署Kafka 一、部署1、前置条件2、下载与解压3、修改配置4、启动kafka二、使用详解1、创建一个主题2、展示所有主题3、启动消费端接收消息4、生产端发送消息三、代码集成pom.xmlapplication.propertiesKafkaConfiguration.javaKafkaConsumer.javaKafkaProducer.javaVehi…...

JS的防抖和节流

目录 防抖 搜索框带来的问题 实现的思路 案例 封装防抖函数 节流 滚动条加载带来的问题 实现的思路 案例 封装节流函数 防抖 搜索框带来的问题 需求&#xff1a;根据输入框内容来请求数据 <!DOCTYPE html> <html lang"en"> <head><…...

互联网加竞赛 基于人工智能的图像分类算法研究与实现 - 深度学习卷积神经网络图像分类

文章目录 0 简介1 常用的分类网络介绍1.1 CNN1.2 VGG1.3 GoogleNet 2 图像分类部分代码实现2.1 环境依赖2.2 需要导入的包2.3 参数设置(路径&#xff0c;图像尺寸&#xff0c;数据集分割比例)2.4 从preprocessedFolder读取图片并返回numpy格式(便于在神经网络中训练)2.5 数据预…...

pip安装报错SSL

confirming the ssl certificate: HTTPSConnectionPool(hostmirrors.cloud.tencent.com, port443) 错误代码如上 偶然搜索&#xff1a;ubuntu pip出错 confirming the ssl certificate: HTTPSConnectionPool(host‘mirrors.cloud.tencent.com’, port443) 看到这个回答 【日常踩…...

手机视频监控客户端APP如何实现跨安卓、苹果和windows平台,并满足不同人的使用习惯

目 录 一、手机视频监控客户端的应用和发展 二、手机视频监控客户端存在的问题 三、HTML5视频监控客户端在手机上实现的方案 &#xff08;一&#xff09;HTML5及其优点 &#xff08;二&#xff09;HTML5在手机上实现视频应用功能的优势 四、手机HTML5…...

从写下第1个脚本到年薪40W,我的自动化测试心路历程

我希望我的故事能够激励现在的软件测试人&#xff0c;尤其是还坚持在做“点点点”的测试人。 你可能会有疑问&#xff1a;“我也能做到这一点的可能性有多大&#xff1f;”因此&#xff0c;我会尽量把自己做决定和思考的过程讲得更具体一些&#xff0c;并尽量体现更多细节。 …...

Vue CLI组件通信

目录 一、组件通信简介1.什么是组件通信&#xff1f;2.组件之间如何通信3.组件关系分类4.通信解决方案5.父子通信流程6.父向子通信代码示例7.子向父通信代码示例8.总结 二、props1.Props 定义2.Props 作用3.特点4.代码演示 三、props校验1.思考2.作用3.语法4.代码演示 四、prop…...

C语言编译器(C语言编程软件)完全攻略(第九部分:VS2019使用教程(使用VS2019编写C语言程序))

介绍常用C语言编译器的安装、配置和使用。 九、VS2019使用教程&#xff08;使用VS2019编写C语言程序&#xff09; 继《八、VS2019下载地址和安装教程&#xff08;图解&#xff09;》之后&#xff0c;本节给大家讲解如何用 VS2019 编写并运行 C 语言程序。 例如&#xff0c;在…...

走向云原生 破局数字化

近年来&#xff0c;随着云计算概念和技术的普及&#xff0c;云原生一词也越来越热门&#xff0c;云原生成为云计算领域的新变量。行业内&#xff0c;华为、阿里巴巴、字节跳动等各个大厂都在“抢滩”云原生市场。行业外&#xff0c;云原生也逐渐出圈&#xff0c;出现在大众视野…...

spring常用注解(三)springbean类

一、Service用于标注业务层组件、 二、Repository用于标注数据访问组件&#xff0c;即DAO组件。 三、Component泛指组件&#xff0c;当组件不好归类的时候&#xff0c;我们可以使用这个注解进行标注。&#xff08;pojo&#xff09; 四、Scope用于指定scope作用域的&#xff…...

qiankun微服务

官网 &#x1f4e6; 基于 single-spa 封装&#xff0c;提供了更加开箱即用的 API。 &#x1f4f1; 技术栈无关&#xff0c;任意技术栈的应用均可 使用/接入&#xff0c;不论是 React/Vue/Angular/JQuery 还是其他等框架。 &#x1f4aa; HTML Entry 接入方式&#xff0c;让你接…...

文件夹重命名方法:提高效率减少错误,中英文批量翻译文件夹名称

在日常生活和工作中&#xff0c;经常要处理大量的文件夹&#xff0c;无论是整理电脑上的文件&#xff0c;还是为项目分类。如何快速、准确地重命名这些文件夹&#xff0c;对于提高工作效率和减少错误至关重要。现在来看下云炫文件管理器一些实用的文件夹重命名方法&#xff0c;…...

【PHP】where和whereOr一起复杂查询示例

在ThinkPHP 5 中&#xff0c;where 和 whereOr 方法可以一起使用以实现复杂的查询条件。以下是一个示例&#xff1a; // 接收的参数 $param $this->request->param();// 实例化 $query new UserModel();// 关联表 $query->with([collect > function($collect_qu…...

Mysql 动态链接库配置步骤+ 完成封装init和close接口

1、创建新项目 动态链接库dll 2、将附带的文件都删除&#xff0c;创建LXMysql.cpp 3、项目设置 3.1、预编译头&#xff0c;不使用预编译头 3.2、添加头文件 3.3、添加类 3.4、写初始化函数 4、项目配置 4.1、右键解决方案-属性-常规-输出目录 ..\..\bin 4.2、生成lib文件 右…...

哈希一致性算法

一致性哈希是什么&#xff0c;使用场景&#xff0c;解决了什么问题&#xff1f; #网站分配请求问题&#xff1f; 大多数网站背后肯定不是只有一台服务器提供服务&#xff0c;因为单机的并发量和数据量都是有限的&#xff0c;所以都会用多台服务器构成集群来对外提供服务。 但…...

基于SpringBoot的在线考试系统绿色

文章目录 项目介绍主要功能截图:部分代码展示设计总结项目获取方式🍅 作者主页:超级无敌暴龙战士塔塔开 🍅 简介:Java领域优质创作者🏆、 简历模板、学习资料、面试题库【关注我,都给你】 🍅文末获取源码联系🍅 项目介绍 基于SpringBoot的在线考试系统绿色,java…...

设计模式:原型模式

原型模式 定义代码实现使用场景 定义 原型模式&#xff08;Prototype Pattern&#xff09;是一种创建型设计模式&#xff0c;它允许通过复制现有的对象来创建新对象&#xff0c;而无需从头开始编写代码。在这个模式中&#xff0c;我们可以使用已经存在的对象作为“原型”&…...

Qt5+VS2013兼容XP方法

用Qt5VS2013编译程序默认配置会在XP运行时报"不是有效的Win32程序" 工作需要必须要XP运行 pro文件中加一句: QMAKE_LFLAGS_WINDOWS /SUBSYSTEM:WINDOWS,5.01 ------------------------------------------------------- qtbase\mkspecs\common\msvc-desktop.conf …...

GitHub Copilot 最佳免费平替:阿里通义灵码

之前分享了不少关于 GitHub Copilot 的文章&#xff0c;不少粉丝都评论让我试试阿里的通义灵码&#xff0c;这让我对通义灵码有了不少的兴趣。 今天&#xff0c;阿七就带大家了解一下阿里的通义灵码&#xff0c;我们按照之前 GitHub Copilot 的顺序分享通义灵码在相同场景下的…...

医疗网站的建设设计要注意什么/郑州粒米seo外包

在我们详细分析SurfaceFlinger之前要了解一下VSync信号&#xff0c;为下一节分析Vsync工作原理打下基础。 VSync信号相关 首先我们要了解以下几个概念&#xff1a; 屏幕刷新率 即 Refresh Rate 或 Scanning Frequency&#xff0c;单位赫兹/Hz&#xff0c;是指设备刷新屏幕的频…...

pa66用途障车做网站/最新国内你新闻

我是python开发, 现在学C, 文中代码格式偏向于python风格, 但不影响代码使用, 文中的代码已通过编译且正常运行: 文章目录一. 指针1.1 注意事项:2.1 难点理解一. 指针 1.1 注意事项: 1.1.1 在printf输出函数中, 输出内存地址的格式控制符是%p, 地址采用十六进制的格式显示.1.…...

如何做阿里巴巴网站/seo外包品牌

为什么80%的码农都做不了架构师&#xff1f;>>> 组合实体&#xff08;Composite Entity&#xff09; - 它是主要的实体 bean。它可以是粗粒的&#xff0c;或者可以包含一个粗粒度对象&#xff0c;用于持续生命周期。粗粒度对象&#xff08;Coarse-Grained Object&a…...

凤楼网站怎么做的/网站推广建站

将/home/my目录做归档压缩&#xff0c;压缩后生成my.tar.bz2文件&#xff0c;并将此文件保存到/home目录下&#xff0c;实现此任务的tar命令格式&#xff1f;tar -zcvf /home/my.tar.bz2 /home/myVim编辑器的三种模式&#xff1f;编辑模式&#xff1a;通过hjkl移动光标、a增加、…...

做网站最贵/百度搜索引擎入口

Linux内核编译概述 Linux 2.6内核编译概述 Linux 2.6内核使用kbuild机制——使用make menuconfig将配置信息保存在.config文件中&#xff0c;当该文件被改变后再重新编译内核&#xff0c;以保证最小化的编译。 Linux 2.6 编译系统 主要包括的文件有&#xff1a; 交互配置工…...

做wish选品参考什么网站/网站多少钱

【DATAGUARD】 基于同一个主机建立物理备库和逻辑备库&#xff08;二&#xff09; 之前发布过一步一步搭建 oracle 11gR2 rac dg&#xff0c;这里的dg为物理dg&#xff0c;但是实际自己使用过程中发现需要开3个虚拟机&#xff0c;机器特卡&#xff0c;所以决定在同一台机器上再…...