C#12:主构造函数

news/2025/2/24 7:00:23/文章来源:https://www.cnblogs.com/axzxs2001/p/18718087
  • record:

  record可以在定义类型时带参,这个参数会转成默认的属性

public record PersonRecord(string FirstName, string LastName)
{public string Name => $"{FirstName} {LastName}";
}

  在实例化完对象后,是可以直接使用这些属性的,但用record定义的类型,不会有默认构造函数。

var pr_1 = new PersonRecord("first", "last");
Console.WriteLine($"FirstName:{pr_1.FirstName}");
Console.WriteLine($"LastName:{pr_1.LastName}");
Console.WriteLine($"Name:{pr_1.Name}");//下面的写法是错误的
//var pr_2 = new PersonRecord();
//Console.WriteLine($"FirstName:{pr_2.FirstName}");
//Console.WriteLine($"LastName:{pr_2.LastName}");
//Console.WriteLine($"Name:{pr_2.Name}");
  • record struct:

  同样,也可以用record关键字来定义结构体,定义如下。

public record struct PersonRecordStruct(string FirstName, string LastName)
{public string Name => $"{FirstName} {LastName}";
}

  不同的是,结构体会默认带一个无参构造。

var prs_1 = new PersonRecordStruct("first", "last");
Console.WriteLine($"FirstName:{prs_1.FirstName}");
Console.WriteLine($"LastName:{prs_1.LastName}");
Console.WriteLine($"Name:{prs_1.Name}");var prs_2 = new PersonRecordStruct();
Console.WriteLine($"FirstName:{prs_2.FirstName}");
Console.WriteLine($"LastName:{prs_2.LastName}");
Console.WriteLine($"Name:{prs_2.Name}");
  • class:

  C#到12时,这个功能扩展到了class上了,可以定义一个主构造函数,不同的是,这个构造函数不会转成类型内部的一个默认属性,而只是供内部成员使用的一个变量,就像一个字段一样使用,通常是初始化一些内部成员。如果有多个构造,可以再次定义,但不同之处在于,这些构造函数必须实现主构造函数,用this()方式调用。

public class PersonClass(string firstName, string LastName)
{public PersonClass() : this("", ""){}public string FirstName { get; } = firstName;public string LastName { get; } = LastName;public string Name => $"{FirstName} {LastName}";
}

  使用时与普通类型无什么差别。

var pc_1 = new PersonClass("first", "last");
Console.WriteLine($"FirstName:{pc_1.FirstName}");
Console.WriteLine($"LastName:{pc_1.LastName}");
Console.WriteLine($"Name:{pc_1.Name}");var pc_2 = new PersonClass();
Console.WriteLine($"FirstName:{pc_2.FirstName}");
Console.WriteLine($"LastName:{pc_2.LastName}");
Console.WriteLine($"Name:{pc_2.Name}");
  • struct:

  同样的能力也会在struct上出现。

public struct PersonStruct(string firstName, string LastName)
{    public string FirstName { get; } = firstName;public string LastName { get; } = LastName;public string Name => $"{FirstName} {LastName}";
}

  不同之处在于结构体依然有默认构造函数。

var ps_1 = new PersonStruct("first", "last");
Console.WriteLine($"FirstName:{ps_1.FirstName}");
Console.WriteLine($"LastName:{ps_1.LastName}");
Console.WriteLine($"Name:{ps_1.Name}");var ps_2 = new PersonStruct();
Console.WriteLine($"FirstName:{ps_2.FirstName}");
Console.WriteLine($"LastName:{ps_2.LastName}");
Console.WriteLine($"Name:{ps_2.Name}");

  文章来源微信公众号

  想要更快更方便的了解相关知识,可以关注微信公众号 

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

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

相关文章

.NET 8下的AOT

相比之前,AOT在.NET8的第5个预览版有了进一步的实现,给我的感觉是在一步步落地,虽然离生产还很远,但还是能看到希望的。使用AOT的API项目与传统的Web API项目在模版就作了区分,分别是“asp.net core api”和“asp.net core web api”,命令行创建项目的短名称是api和webap…

用deepseek4j开发私有大模型知识库

DeepSeek R1 凭借其强大的思维链能力在开发者中广受欢迎,但 Spring AI 等主流框架对其支持不足,特别是在思维链内容保留和流式输出方面存在诸多限制。deepseek4j 1.4 版本重磅发布支持向量模型等重要更新。 背景 deepseek4j 提供了一套强大的 API,涵盖了 Reasoner、Function…

简单的tcp客户端协议1.0

先添加包代码部分: using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Forms; using STTech.BytesIO.Co…

【OpenAISK】:实现自己的问答机器人

前ChatGPT让人惊叹的是,它好像有了真人的思维逻辑,能记住上下文,还能很融洽地和你聊天,并且回答问题让你满意。但如果你问他一些自己身边事,或者公司最新产品的事,ChatGPT的回复就天马行空了。怎么才能让他成为自己的问答机器人呢?下面给出了一个简单的事例,一起看一下…

Windows的MySQL数据库升级(安装器方式)

1、背景描述 原来的 MySQL 在安装时,是最新的稳定版本 5.7.33 。 经过一段时间后,在原来的 MySQL 版本中,发现存在漏洞。 因为 MySQL 的官方补丁,需要 Oracle 的 si 码(Support Identifier),不是免费的。 因此,只好将旧版本(5.7.33)升级到没有漏洞的新版本(5.7.44)…

OpenAISK】:SemanticKernel简说

OpenAI全身是有原生API的,也有一些开源的库,不过都是简单对原生API的封装,这个系统主要通过SemanticKernel来使用OpenAI。SemanticKernel简单称SK,是一个轻量级的使用OpenAI和Azure AI的SDK。利用SK可以更轻松,便捷的使用AI的能力,同时,它还提供编排的能力,使AI与本地服…

[开源] 分享一个自己开发的, 整合SMS/Mail/Telegram/微信四个平台的信息收发平台

起因于已有的聚合信息发送平台无法满足自己的需求. 不支持我需要的平台,或不支持接收信息后进行处理,或不放心把涉及隐私的消息通过第三方平台发送利用SMS发送短信(上一篇文章中分享的开源项目) 利用SMTP/IMAP收发邮件 利用Telegram Bot收发消息 利用企业微信应用收发消息 Web界…

[开源] 分享一个自己开发的记账工具

起因于没找到符合自己需求的记账工具, 于是写了一个多用户 自定义银行,货币类型,银行卡类型 保存银行卡信息 自定义汇率 自定义交易分类(收入/支出/转账/兑换下的子分类 创建钱包, 以及钱包下的划分, 每个划分绑定到某张银行卡 创建愿望单, 与钱包功能一致 创建债务, 与钱包功能…

chatGPT助力医保接口开发

在下面的文章中,用到反射来设计医保接口,因为国内的医保接口有一个特点,就是接口基本是统一的,接中传的数据是有一定规律的,这样方便对接后业务级的升级扩展,所以在对接医保接口时,就很容易用OOP来设计一个微框架来对应。用反射开发医保接口桂素伟,公众号:桂迹 .NET架…

BUUCTF-PWN-[第五空间2019 决赛]PWN5

学到一个新的做法,在每次分析前,先使用checksec来检查程序是否有特定的保护这里我们可以看到程序开启了NX和Canary保护:NX保护,实际上就是将数据段,设为仅对代码段可见,操作者无法对数据段中的内容进行修改,也不能被执行 Canary保护,会在栈帧中(一般是返回地址之前)插…

vxe-table grid 4.11+ 和 3.13+ 使用展开行详解

vxe-table 使用展开行的两种模式详解, vxe-table 4.11+ v3.13+展开内容支持两种方式,固定和内嵌,其中默认的固定模式是全功能的,内嵌模式不支持虚拟滚动。 官网:https://vxetable.cn 固定模式固定模式,渲染性能最好,支持冻结列、虚拟滚动和单元格选择等 <template>…

【后端】简化部署交互设计方案V2

一、部署流程 1.1 按需获取安装包 获取安装包和校验码,并校验安装包的完整性。 1.2 配置安装和升级部署 解压安装包,配置必要的参数(例如IP和主机名等),然后执行安装工具进行安装,如果授权码有误,则会退出安装。安装的时候会根据当前已经安装的版本情况,让用户选择升级…