如何在 C# 12 中使用主构造函数
C# 12 中最引人注目的新功能之一是对主构造函数的支持。主构造函数的概念并不新鲜。包括 Scala、Kotlin 和 OCaml 在内的多种编程语言都支持直接在声明类的位置集成构造函数参数。
在本文中,我们将仔细研究主构造函数以及如何在 C# 12 中使用它们。若要运行本文中提供的代码示例,您应该在系统中安装 Visual Studio 2022。
在 Visual Studio 中创建控制台应用程序项目
首先,让我们在 Visual Studio 中创建一个 .NET Core 控制台应用程序项目。假设您的系统中安装了 Visual Studio 2022,请按照下面概述的步骤创建新的 .NET Core 控制台应用程序。
- 启动 Visual Studio IDE。
- 单击“创建新项目”。
- 在“创建新项目”窗口中,从显示的模板列表中选择“控制台应用程序(.NET Core)”。
- 点击下一步。
- 在“配置新项目”窗口中,指定新项目的名称和位置。
- 点击下一步。
- 在接下来显示的“其他信息”窗口中,选择“.NET 8.0(长期支持)”作为您要使用的框架版本。
- 单击“创建”。
在本文的后续部分中,我们将使用此 .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# 中的主构造函数具有三个主要优点。
- 简化的语法:通过使用主构造函数,您可以直接在构造函数参数中声明和初始化属性,从而减少代码重复。
- 轻松初始化:您可以利用主构造函数来使用默认值或作为构造函数参数传递的特定值来初始化类的属性。
- 不变性:您可以利用主构造函数中初始化的属性的 init 修饰符,以确保它们在对象初始化后是只读的。
C# 中的主构造函数也有许多缺点。
- 灵活性降低:主构造函数设计得很简单,这会限制它们的灵活性。当需要复杂的初始化逻辑或需要额外的操作(例如验证、调度或日志记录)时,它们可能不适合。
- 不太明确的代码:减少样板代码是一个很好的做法,但它也可以使代码不那么明确。缺乏经验的开发人员可能需要帮助来理解属性如何初始化或构造函数如何工作。
- 兼容性问题:将主构造函数的新语法无缝集成到现有代码库中可能具有挑战性,特别是在代码库庞大且复杂的情况下。
- 对访问修饰符的控制有限:与传统构造函数相比,主构造函数对访问修饰符的控制较少。因此,主构造函数可能不适合需要对可访问性进行细粒度控制的场景。
- 学习曲线:由于主构造函数对于 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 在内的多种编程语言都支持直接在声明类的位置集成构造函数参数。 在本文中,我们将仔细研究主构造函数以及如何在 C# 12 中使用它们。若要运行本文中提…...
Zookeeper之Java客户端实战
ZooKeeper应用的开发主要通过Java客户端API去连接和操作ZooKeeper集群。可供选择的Java客户端API有: ZooKeeper官方的Java客户端API。第三方的Java客户端API,比如Curator。 接下来我们将逐一学习一下这两个java客户端是如何操作zookeeper的。 1. ZooKe…...
将文本文件导入Oracle数据库的简便方法:SQL Loader Express
需求 我有一个文本文件dbim.txt,是通过alert log生成的,内容如下: 2020-09-11 2020-09-11 ... 2023-12-03 2023-12-03 2023-12-26我已经在Oracle数据库中建立了目标表: 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都是远程过程调用(RPC)框架,用于实现分布式系统中不同节点之间的通信。它们之间的主要区别如下: 架构设计:Eureca是一个基于JavaScript的RPC框架,它使用了WebSockets作为传输层协议。Eureca C…...
python中parsel模块的css解析
一、爬虫页面分类 1.想要爬取的内容全部在标签中,可以使用xpath去进行解析如下图 2.想要爬取的内容呈现json的数据特征,用.json()转换为字典格式 3.页面不规则,标签中包含大括号,如下面想要获取键值内容怎么做,先用re正…...
Oracle OCP怎么样线上考试呢
大家好!今天咱们就来聊聊Oracle OCP这个让人又爱又恨的认证。为啥说又爱又恨呢?因为它既是IT界的“金字招牌”,又是一块硬骨头,不是那么容易啃下来的。好了,废话不多说,我们直奔主题,来看看关于…...
如何让自己的写的程序在阿里云一直运行
购买了阿里云服务器后,每次要用自己写在阿里云的服务器程序都要连接到云端 然后./运行该程序,而且每次一断开终端,该服务器就会自动停止,这样使用相当麻烦。那怎样才能让我们的服务器一直在云端后台运行,即便退出终端…...
【计算机图形学】NAP: Neural 3D Articulation Prior
文章目录 1. 这篇论文做了什么事,有什么贡献?2. Related Work铰接物体建模3D中的Diffusion model扩散模型 3. Pipeline铰接树参数化基于Diffusion的铰接树生成去噪网络 4. 实验评价铰接物体生成——以往做法与本文提出的新指标NAP捕捉到的铰接物体分布质…...
知识付费平台搭建?找明理信息科技,专业且高效
明理信息科技知识付费saas租户平台 在当今数字化时代,知识付费已经成为一种趋势,越来越多的人愿意为有价值的知识付费。然而,公共知识付费平台虽然内容丰富,但难以满足个人或企业个性化的需求和品牌打造。同时,开发和…...
CentOS7部署Kafka
CentOS7部署Kafka 一、部署1、前置条件2、下载与解压3、修改配置4、启动kafka二、使用详解1、创建一个主题2、展示所有主题3、启动消费端接收消息4、生产端发送消息三、代码集成pom.xmlapplication.propertiesKafkaConfiguration.javaKafkaConsumer.javaKafkaProducer.javaVehi…...
JS的防抖和节流
目录 防抖 搜索框带来的问题 实现的思路 案例 封装防抖函数 节流 滚动条加载带来的问题 实现的思路 案例 封装节流函数 防抖 搜索框带来的问题 需求:根据输入框内容来请求数据 <!DOCTYPE html> <html lang"en"> <head><…...
互联网加竞赛 基于人工智能的图像分类算法研究与实现 - 深度学习卷积神经网络图像分类
文章目录 0 简介1 常用的分类网络介绍1.1 CNN1.2 VGG1.3 GoogleNet 2 图像分类部分代码实现2.1 环境依赖2.2 需要导入的包2.3 参数设置(路径,图像尺寸,数据集分割比例)2.4 从preprocessedFolder读取图片并返回numpy格式(便于在神经网络中训练)2.5 数据预…...
pip安装报错SSL
confirming the ssl certificate: HTTPSConnectionPool(hostmirrors.cloud.tencent.com, port443) 错误代码如上 偶然搜索:ubuntu pip出错 confirming the ssl certificate: HTTPSConnectionPool(host‘mirrors.cloud.tencent.com’, port443) 看到这个回答 【日常踩…...
手机视频监控客户端APP如何实现跨安卓、苹果和windows平台,并满足不同人的使用习惯
目 录 一、手机视频监控客户端的应用和发展 二、手机视频监控客户端存在的问题 三、HTML5视频监控客户端在手机上实现的方案 (一)HTML5及其优点 (二)HTML5在手机上实现视频应用功能的优势 四、手机HTML5…...
从写下第1个脚本到年薪40W,我的自动化测试心路历程
我希望我的故事能够激励现在的软件测试人,尤其是还坚持在做“点点点”的测试人。 你可能会有疑问:“我也能做到这一点的可能性有多大?”因此,我会尽量把自己做决定和思考的过程讲得更具体一些,并尽量体现更多细节。 …...
Vue CLI组件通信
目录 一、组件通信简介1.什么是组件通信?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使用教程(使用VS2019编写C语言程序) 继《八、VS2019下载地址和安装教程(图解)》之后,本节给大家讲解如何用 VS2019 编写并运行 C 语言程序。 例如,在…...
走向云原生 破局数字化
近年来,随着云计算概念和技术的普及,云原生一词也越来越热门,云原生成为云计算领域的新变量。行业内,华为、阿里巴巴、字节跳动等各个大厂都在“抢滩”云原生市场。行业外,云原生也逐渐出圈,出现在大众视野…...
日语学习-日语知识点小记-构建基础-JLPT-N4阶段(33):にする
日语学习-日语知识点小记-构建基础-JLPT-N4阶段(33):にする 1、前言(1)情况说明(2)工程师的信仰2、知识点(1) にする1,接续:名词+にする2,接续:疑问词+にする3,(A)は(B)にする。(2)復習:(1)复习句子(2)ために & ように(3)そう(4)にする3、…...
《Qt C++ 与 OpenCV:解锁视频播放程序设计的奥秘》
引言:探索视频播放程序设计之旅 在当今数字化时代,多媒体应用已渗透到我们生活的方方面面,从日常的视频娱乐到专业的视频监控、视频会议系统,视频播放程序作为多媒体应用的核心组成部分,扮演着至关重要的角色。无论是在个人电脑、移动设备还是智能电视等平台上,用户都期望…...
ssc377d修改flash分区大小
1、flash的分区默认分配16M、 / # df -h Filesystem Size Used Available Use% Mounted on /dev/root 1.9M 1.9M 0 100% / /dev/mtdblock4 3.0M...
【网络安全产品大调研系列】2. 体验漏洞扫描
前言 2023 年漏洞扫描服务市场规模预计为 3.06(十亿美元)。漏洞扫描服务市场行业预计将从 2024 年的 3.48(十亿美元)增长到 2032 年的 9.54(十亿美元)。预测期内漏洞扫描服务市场 CAGR(增长率&…...
HTML 列表、表格、表单
1 列表标签 作用:布局内容排列整齐的区域 列表分类:无序列表、有序列表、定义列表。 例如: 1.1 无序列表 标签:ul 嵌套 li,ul是无序列表,li是列表条目。 注意事项: ul 标签里面只能包裹 li…...
【C语言练习】080. 使用C语言实现简单的数据库操作
080. 使用C语言实现简单的数据库操作 080. 使用C语言实现简单的数据库操作使用原生APIODBC接口第三方库ORM框架文件模拟1. 安装SQLite2. 示例代码:使用SQLite创建数据库、表和插入数据3. 编译和运行4. 示例运行输出:5. 注意事项6. 总结080. 使用C语言实现简单的数据库操作 在…...
MySQL用户和授权
开放MySQL白名单 可以通过iptables-save命令确认对应客户端ip是否可以访问MySQL服务: test: # iptables-save | grep 3306 -A mp_srv_whitelist -s 172.16.14.102/32 -p tcp -m tcp --dport 3306 -j ACCEPT -A mp_srv_whitelist -s 172.16.4.16/32 -p tcp -m tcp -…...
laravel8+vue3.0+element-plus搭建方法
创建 laravel8 项目 composer create-project --prefer-dist laravel/laravel laravel8 8.* 安装 laravel/ui composer require laravel/ui 修改 package.json 文件 "devDependencies": {"vue/compiler-sfc": "^3.0.7","axios": …...
Python ROS2【机器人中间件框架】 简介
销量过万TEEIS德国护膝夏天用薄款 优惠券冠生园 百花蜂蜜428g 挤压瓶纯蜂蜜巨奇严选 鞋子除臭剂360ml 多芬身体磨砂膏280g健70%-75%酒精消毒棉片湿巾1418cm 80片/袋3袋大包清洁食品用消毒 优惠券AIMORNY52朵红玫瑰永生香皂花同城配送非鲜花七夕情人节生日礼物送女友 热卖妙洁棉…...
AirSim/Cosys-AirSim 游戏开发(四)外部固定位置监控相机
这个博客介绍了如何通过 settings.json 文件添加一个无人机外的 固定位置监控相机,因为在使用过程中发现 Airsim 对外部监控相机的描述模糊,而 Cosys-Airsim 在官方文档中没有提供外部监控相机设置,最后在源码示例中找到了,所以感…...
