C#12:主构造函数
- 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}");
文章来源微信公众号
想要更快更方便的了解相关知识,可以关注微信公众号
****欢迎关注我的asp.net core系统课程****
《asp.net core精要讲解》 https://ke.qq.com/course/265696
《asp.net core 3.0》 https://ke.qq.com/course/437517
《asp.net core项目实战》 https://ke.qq.com/course/291868
《基于.net core微服务》 https://ke.qq.com/course/299524
《asp.net core精要讲解》 https://ke.qq.com/course/265696
《asp.net core 3.0》 https://ke.qq.com/course/437517
《asp.net core项目实战》 https://ke.qq.com/course/291868
《基于.net core微服务》 https://ke.qq.com/course/299524
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?