C构造函数与初始化详解

立即解锁
发布时间: 2025-09-15 00:31:53 阅读量: 1 订阅数: 9 AIGC
### C# 构造函数与初始化详解 在 C# 编程中,对象的初始化和构造函数的使用是非常重要的概念。下面将详细介绍字段初始化、构造函数的各种类型以及它们的执行顺序等内容。 #### 1. 字段初始化 非实例字段(常量和静态字段)的初始化器在结构体中总是会被执行。对于非常量字段,如果提供了初始化表达式,它不需要在编译时就可求值,因此可以进行运行时工作,如调用方法或读取属性。不过,这类代码可能会有副作用,所以了解初始化器的执行顺序很重要。 非静态字段初始化器会为每个创建的实例运行,并且按照它们在文件中出现的顺序执行,恰好在构造函数运行之前。静态字段初始化器无论创建多少该类型的实例,最多只执行一次,它们也按声明顺序执行,但确切的执行时间较难确定。 如果类没有静态构造函数,C# 保证在首次访问类中的字段之前运行字段初始化器,但不一定会等到最后一刻,它有权尽早运行。如果存在静态构造函数,静态字段初始化器会在静态构造函数运行之前立即执行。 #### 2. 构造函数 新创建的对象可能需要一些信息才能正常工作。例如,`System` 命名空间中的 `Uri` 类表示统一资源标识符(URI),如 URL。由于其目的是包含和提供关于 URI 的信息,所以不提供 URI 就无法创建 `Uri` 对象。 ```csharp // 错误示例:未提供 URI 创建 Uri 对象 Uri oops = new Uri(); // 无法编译 ``` `Uri` 类定义了多个构造函数,构造函数是包含初始化类型新实例代码的成员。如果某个类需要特定信息才能工作,可以通过构造函数来强制这个要求。 定义构造函数时,首先指定可访问性(如 `public`、`private`、`internal` 等),然后是包含类型的名称,接着是括号内的参数列表(可以为空)。 ```csharp // 具有一个构造函数的类 public class Item { public Item(decimal price, string name) { _price = price; _name = name; } private readonly decimal _price; private readonly string _name; } ``` 这个构造函数很简单,只是将参数复制到字段。很多构造函数的功能也仅此而已。不过,按照惯例,开发者通常期望构造函数做的事情尽量少,其主要工作是确保对象处于有效的初始状态。 使用构造函数时,只需使用 `new` 运算符,并传入合适类型的值作为参数。 ```csharp // 使用构造函数 var item1 = new Item(9.99M, "Hammer"); ``` 可以定义多个构造函数,但必须能够区分它们,不能定义两个接受相同数量和类型参数的构造函数,因为 `new` 关键字无法知道你想要调用哪一个。 记录类型在定义时实际上也定义了构造函数。 ```csharp // 具有编译器生成构造函数的记录类型 public record Item(decimal Price, string Name); ``` 编译器会生成一个接受 `decimal` 和 `string` 参数的构造函数,用于初始化 `Price` 和 `Name` 属性。如果编译器生成的构造函数能满足需求,使用起来会很方便。 #### 3. 默认构造函数和无参数构造函数 如果根本不定义任何构造函数,C# 会提供一个默认构造函数,相当于一个空的无参数构造函数。对于结构体,即使定义了其他构造函数,也会有默认构造函数。 需要注意的是,“默认构造函数” 有两种含义。C# 规范明确将其定义为由编译器生成的构造函数,但在实际中,它也常用来表示任何公共的无参数构造函数,无论是否由编译器生成。 编译器生成的默认构造函数除了对字段进行零初始化外,不做其他事情。但在某些情况下,需要编写自己的无参数构造函数。例如,可能需要构造函数执行一些代码。 ```csharp // 非空的无参数构造函数 public class ItemWithId { private static int _lastId; private int _id; public ItemWithId() { _id = ++_lastId; } } ``` 也可以通过编写静态方法来实现相同的效果,但将代码放在构造函数中有一个优势:字段初始化器不允许调用对象自身的非静态方法,但构造函数可以。这是因为在字段初始化期间,对象处于不完整状态,调用非静态方法可能有危险。 如果为类定义了至少一个构造函数,默认构造函数的生成将被禁用。如果需要类提供参数化构造,同时又想提供无参数构造函数,就需要自己编写,即使它是空的。另外,如果想编写一个只有空的无参数构造函数,但保护级别不是默认的公共级别(如设为私有),也需要显式编写构造函数。 对于结构体,无参数构造函数的工作方式略有不同。由于值类型需要支持隐式初始化,当值类型用作其他类型的字段或数组的元素类型时,CLR 会将其内存初始化为零。因此,即使 C# 在类中添加带参数的构造函数时会移除默认构造函数,但对于结构体不会这样做。在 C# 10.0 之前,不允许为结构体编写无参数构造函数,现在可以编写,但要注意它只在代码显式调用构造函数时才会运行,大多数情况下使用的是 CLR 的零初始化。 还有一种编译器生成的构造函数:当编写记录或记录类时,编译器会生成一个构造函数,用于在使用 `with` 语法创建副本时使用。默认情况下,它执行浅拷贝,也可以自己编写实现。 ```csharp // 具有自定义复制构造函数的记录类型 public record ValueWithId(int Value, int Id) { public ValueWithId(ValueWithId source) { Value = source.Value; Id = source.Id + 1; } } ``` 编译器不会为记录结构体生成复制构造函数,因为所有结构体类型本质上都是可复制的。 #### 4. 构造函数链 如果一个类型定义了多个构造函数,它们可能有一些共同的初始化任务。可以通过构造函数链来解决这个问题。 ```csharp // 可选的构造函数链 public class ItemWithId { private static int _lastId; private int _id; private stri ```
corwn 最低0.47元/天 解锁专栏
买1年送3月
继续阅读 点击查看下一篇
profit 400次 会员资源下载次数
profit 300万+ 优质博客文章
profit 1000万+ 优质下载资源
profit 1000万+ 优质文库回答
复制全文

相关推荐

李_涛

知名公司架构师
拥有多年在大型科技公司的工作经验,曾在多个大厂担任技术主管和架构师一职。擅长设计和开发高效稳定的后端系统,熟练掌握多种后端开发语言和框架,包括Java、Python、Spring、Django等。精通关系型数据库和NoSQL数据库的设计和优化,能够有效地处理海量数据和复杂查询。
最低0.47元/天 解锁专栏
买1年送3月
百万级 高质量VIP文章无限畅学
千万级 优质资源任意下载
千万级 优质文库回答免费看
立即解锁

专栏目录

最新推荐

Intel I219-V MAC修改失败?这10个常见问题你必须知道

![Intel I219-V MAC修改失败?这10个常见问题你必须知道](https://www.ubackup.com/screenshot/es/others/windows-11/crear-soporte-de-instalacion.png) # 摘要 Intel I219-V网卡作为主流有线网络接口,其MAC地址的可配置性在特定应用场景中具有重要意义。本文系统阐述了Intel I219-V网卡的技术架构与MAC地址修改的实现机制,涵盖从操作系统层面到BIOS/UEFI底层的多种修改方法。针对实际操作中常见的修改失败问题,本文深入分析了驱动兼容性、固件限制及主板策略等关键因素

火电机组调频与电力系统稳定协同建模:Matlab多系统联合仿真全解析

![火电机组调频与电力系统稳定协同建模:Matlab多系统联合仿真全解析](https://img-blog.csdnimg.cn/2091f692e9af48518ac9c139708304cf.jpeg) # 摘要 本文围绕火电机组调频与电力系统稳定协同建模展开系统研究,首先分析火电机组调频的基本原理与动态建模方法,重点探讨一次调频与二次调频机制及关键参数影响,并基于Matlab/Simulink构建调频仿真模型。随后,深入研究电力系统稳定性的核心理论与建模技术,涵盖静态与暂态稳定分析及同步发电机建模。进一步提出火电机组与电网系统的多域协同建模方法与联合仿真框架,解决数值稳定性与模型

从仿真到硬件:基于FPGA的PMF-FFT捕获实现全路径解析(Matlab到RTL落地)

![从仿真到硬件:基于FPGA的PMF-FFT捕获实现全路径解析(Matlab到RTL落地)](https://www.logic-fruit.com/wp-content/uploads/2023/11/ARINC-429-Standards-1024x536.jpg) # 摘要 本文围绕FPGA与卫星信号捕获技术展开研究,重点分析PMF-FFT捕获算法的理论基础、建模仿真及其在FPGA上的系统实现。文章从扩频通信与伪码同步原理出发,推导PMF-FFT算法的数学模型,并基于Matlab平台完成算法建模与性能验证。随后,研究了算法从浮点到定点的转换过程,完成了模块划分与FPGA资源映射设

移动设备适配DSDIFF Decoder:资源优化与性能调优关键策略

![移动设备适配DSDIFF Decoder:资源优化与性能调优关键策略](https://img-blog.csdnimg.cn/direct/8979f13d53e947c0a16ea9c44f25dc95.png) # 摘要 本文围绕DSDIFF音频格式在移动设备上的解码与适配问题展开研究,系统解析了DSD音频原理及DSDIFF文件结构,深入探讨了解码流程、转换机制与主流解码器架构,并分析了移动平台在音频处理中面临的CPU、内存与操作系统限制。针对资源瓶颈,本文提出多线程解码、内存复用、NEON加速等优化策略,并结合动态频率调整与后台调度实现功耗控制。通过性能基准测试与实际调优案例

AI训练系统Spillover管理:GPU内存溢出与重调度实战指南

![AI训练系统Spillover管理:GPU内存溢出与重调度实战指南](https://img-blog.csdnimg.cn/2020090115430835.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3NoaW5lXzYwODg=,size_16,color_FFFFFF,t_70) # 摘要 本文围绕GPU内存溢出问题及其在AI训练系统中的管理机制展开研究,系统分析了GPU显存溢出的基本原理、诊断方法与优化策略。文章详

数据安全完整方案:Metabase备份与恢复操作的5个最佳实践

![数据安全完整方案:Metabase备份与恢复操作的5个最佳实践](https://d2908q01vomqb2.cloudfront.net/887309d048beef83ad3eabf2a79a64a389ab1c9f/2021/07/21/DBBLOG-1488-image001.png) # 摘要 Metabase作为企业数据分析的重要工具,其数据安全性和备份恢复机制至关重要。本文系统探讨了Metabase在数据安全方面的核心问题,深入分析其架构组成与备份恢复机制,详细介绍了全量备份、增量备份、冷备份与热备份等策略的适用场景。文章结合实践,阐述了备份计划制定、数据库操作、应用

波浪能发电多目标优化控制策略(MATLAB实现):兼顾效率与稳定性的高级技巧

![波浪能发电电能管理,波浪能发电技术,matlab](https://www.acteurdurable.org/wp-content/uploads/2022/12/desalinisation-par-emectrodialyse-1024x531.jpg) # 摘要 本文围绕波浪能发电系统的控制与优化问题展开研究,系统分析了其工作原理与控制挑战,构建了多目标优化的理论框架,并介绍了常用多目标优化算法及其在波浪能系统中的建模与应用方法。基于MATLAB/Simulink平台,完成了系统建模、控制设计及仿真实验,评估了不同海况下的效率与稳定性表现。进一步提出了一种兼顾效率与稳定性的协

深度解析LIN协议栈状态机设计与实现(源码级解析)

![深度解析LIN协议栈状态机设计与实现(源码级解析)](https://img-blog.csdnimg.cn/20200729140518872.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L0hlbm55cw==,size_16,color_FFFFFF,t_70) # 摘要 本文围绕LIN协议栈状态机的设计与实现展开系统研究,首先介绍LIN协议的核心通信机制及其在主从架构下的帧结构、调度表与错误检测原理,进而结合有限状态机

毫米波雷达设计新思路:PO方法在车载雷达中的5大应用场景解析

![毫米波雷达设计新思路:PO方法在车载雷达中的5大应用场景解析](https://www.vikylin.com/wp-content/uploads/2023/10/Discover-Practical-Uses-of-Motion-Detection-in-Surveillance-Cameras-Systems.jpg) # 摘要 本文围绕物理光学(PO)方法在车载毫米波雷达设计中的应用展开系统研究,首先介绍毫米波雷达技术的基本原理及其在智能驾驶中的应用场景,随后深入阐述物理光学方法的理论基础、建模流程及其在复杂目标与多路径环境下的适用性。文章重点分析了PO方法在行人识别、障碍物

多壁碳纳米管建模验证全流程:LAMMPS结构构建实战指南

![多壁碳纳米管建模验证全流程:LAMMPS结构构建实战指南](https://static.wixstatic.com/media/49f946_e60f68ea432b45c5b39545e4d36705a7~mv2.png/v1/fill/w_980,h_551,al_c,q_90,usm_0.66_1.00_0.01,enc_auto/49f946_e60f68ea432b45c5b39545e4d36705a7~mv2.png) # 摘要 本文围绕多壁碳纳米管的建模方法与分子动力学模拟技术展开,系统介绍了基于LAMMPS平台的建模流程与力学性能分析手段。首先阐述了碳纳米管的几何