详细介绍:深入剖析C#构造函数执行:基类调用、初始化顺序与访问控制

news/2025/10/6 14:21:36/文章来源:https://www.cnblogs.com/lxjshuju/p/19127594

导言

在面向对象编程中,理解对象构造过程至关重要。C#的构造函数执行遵循严格的顺序规则,尤其是涉及继承和成员初始化时。本文将深入解析构造函数的执行流程、初始化语句的妙用以及类访问修饰符的影响,助你写出更健壮、可维护的代码。

构造函数的执行顺序(核心规则)

对象创建的起点:成员初始化
对象创建时,最先执行的是所有实例字段的初始化(无论是否显式赋值)。未赋值的字段获得其类型的默认值(如 int 默认为 0)。

class MyDerivedClass : MyBaseClass
{
int MyField1 = 5
;
// 1. 初始化 (值=5)
int MyField2;
// 1. 初始化 (值=0, 默认值)
...
}

基类优先:向上追溯

完成实例成员初始化后,立即隐式调用基类的构造函数。若未显式指定基类构造函数,则调用基类的无参构造函数 base()。

public MyDerivedClass(
) // 2. 隐式调用基类构造函数 MyBaseClass()
{
... // 3. 最后执行派生类构造函数体
}

自身构造:最后执行

基类构造函数执行完毕后,最后才执行派生类自身的构造函数体中的代码。

? 总结顺序:

派生类成员初始化 → 基类构造函数调用 → 派生类构造函数体执行

⚠️ 重要警告:构造函数中避免调用虚方法!

掌控构造:构造函数初始化语句

C# 提供了强大的语法让你精确控制调用哪个构造函数。

base 关键字:指定基类构造函数
当基类有多个构造函数时,使用 base 显式选择调用哪一个。

class MyDerivedClass : MyBaseClass
{
public MyDerivedClass(int x, string s) :
base(x, s) // 显式调用基类带参构造 
{
... // 基类构造执行完后,执行此派生类构造体 
}
}

this 关键字:复用同类构造函数

用于在当前类的不同构造函数之间复用初始化逻辑,避免代码重复。

class MyClass
{
public MyClass(string firstName) :
this(
) // 先调用本类的无参构造 
{
UserName = firstName;
UserId = -1
;
}
public MyClass(int id) :
this(
) // 也先调用本类的无参构造
{
UserName = "Anonymous"
;
UserId = id;
}
private MyClass(
) // 公共初始化逻辑放在私有构造中
{
// 初始化 readonly 字段或公共设置 
CommonInit1 = 10
;
CommonInit2 = 20
;
}
}

默认行为:base() 的简写

如果声明构造函数时未指定初始化语句(: base(…) 或 : this(…)),编译器自动添加 : base(),表示调用基类无参构造函数。

类的可见性:public vs internal

类的访问级别决定了它在程序集内外的可见性。

public:全局可见

internal:程序集内可见 (默认)

? 访问规则图解

透彻理解构造函数和可见性,是构建健壮、可扩展C#应用的基石! 你在项目中遇到过哪些构造函数相关的“坑”?欢迎留言分享讨论!

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

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

相关文章

公司网站建设进度vitality wordpress

TCP与UDP TCP 是面向连接的、可靠的流协议,通过三次握手建立连接,通讯完成时要拆除连接。 UDP是面向无连接的通讯协议,UDP通讯时不需要接收方确认,属于不可靠的传输,可能会出现丢包现象 端口号: 端口号用…

上海网站建设 销售营销型网站开发推荐

一、产品介绍 此次发布一款7寸高清全新外壳产品,让HMI人机界面家族再添一新成员。该产品相比其他外壳有以下5个大改动: 1 表面玻璃盖板使用2.5D立体结构; 2 液晶盖板采用一体黑设计,且液晶屏与触摸板是全贴合结构; …

广州网站建设培训学校seo优化外包

了解动态内存函数 前言:一、malloc函数二、calloc函数三、realloc函数四、free函数 前言: 在C语言中,动态内存函数是块重要的知识点。以往,我们开辟空间都是固定得,数组编译结束后就不能继续给它开辟空间了&#xff0…

[LUCKY」在Windows下使用STUN穿透实现Minecraft联机并设置SRV记录

[LUCKY」在Windows下使用STUN穿透实现Minecraft联机并设置SRV记录2024.02.18 本教程目标 在无公网环境低成本的实现较为稳定的 Minecraft Java版联机(服务器) 目前常见的联机(服务器)方法及其问题(针对好友联机和小…

系统管理员的日常困境与幽默自嘲

这篇文章通过Reddit论坛上系统管理员们的真实讨论,展现了IT专业人员面对"请联系系统管理员"这类提示时的无奈与幽默,揭示了技术支持工作中的常见困境和职业共鸣。这篇文章通过Reddit论坛上系统管理员们的真…

46设计网站官网网站开发项目团队人员

前言 如果你被hutool坑过、被fastjson坑过,nicetool帮你解脱! 如果你想用稳定、Spring原生的工具类,nicetool已帮你封装! nicetool不生产工具,只是JDK和Spring的封装侠! 介绍 nicetool:超好…

实用指南:Docker 在 AI 开发中的实践:GPU 支持与深度学习环境的容器化

实用指南:Docker 在 AI 开发中的实践:GPU 支持与深度学习环境的容器化pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: …

电子商务网站类型培训学校 网站费用

处理域名连接nacos读取配置异常 1 项目启动报错2 问题处理3 刷新依赖重启问题解决 1 项目启动报错 使用ip可以正在启动,但是使用域名报下面的错误 2024-06-15 17:37:22.981 ERROR 29268 --- [ main] c.a.c.n.c.NacosPropertySourceBuilder : parse …

视频素材网站建设有没有专门做印刷图的网站

前言 对于使用jmeter工具完成接口测试的测试工程师而言。在工作中,或者在面试中,都会遇到一个问题。 CSV文档做了一大笔测试数据后,怎么去校验这个结果呢? 现在大部分测试工程师可能都是通过人工的方法去查看结果,十几…

AI数据标注平台获融资挑战行业巨头

一家AI数据平台公司获得1300万美元融资,专注于为开发者提供数据标注、管理和模型评估工具,帮助构建高质量AI训练数据集,客户包括多家知名科技企业。AI数据平台获得1300万美元融资挑战行业竞争对手 人工智能数据平台…

详细介绍:如何用 pnpm patch 给 element-plus 打补丁修复线上 bug(以 2.4.4 修复 PR#15197 为例)

详细介绍:如何用 pnpm patch 给 element-plus 打补丁修复线上 bug(以 2.4.4 修复 PR#15197 为例)pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block…

广州网站ui设计贵港免费的网站建设

我是个前端菜鸡,最近准备学习一点前端知识,先从Bootstrap5开始,毕竟早期Bootstrap还是比较火的。推出的Bootstrap5不再和jQery强制绑定,这里直接按照官方文档上来操作,打包工具我们选择Webpack。 一 前期准备 前期准备…

网站开发工具最好用做网站的工作量

https://blog.csdn.net/layman1024/article/details/72628379

Go 为何天生适合云原生? - 指南

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

ARC 207

目前打得最好的一集。 A 考虑如果 \(\le 0\) 还会减一,那么花掉的钱就是,\(1+2+\cdots +(n-1)\)。现在的问题就是,可能少花掉一些。 最多花掉 \(\mathcal{O}(n^2)\),所以考虑计数这个。发现其实,花掉的是 \(\sum_…

半年小结 Vol4. 跌跌撞撞开启 PhD 生涯

最近一直没能抽出时间总结于是半年总结一直拖拖拖,距离上次半年复盘已过了九个月,这九个月发生了很多:职业发展上经历了 idea 、实现、回片测试完整走完第一个加速器流片工作,切身体会了流片的血与泪; 第一次离开…

资源网站很难做做长图文网站

在c++中,一个文件调用另外一个文件最直接最快捷的方式就是#incldue<头文件>的使用,那么在元数据描述性语言QML中,如何从一个界面描述调用另外一个界面描述,一个.qml文件调用另外一个.qml呢?QML虽然有个import,但是用法可以说完全不同于#include。 引用方法1:直接…

大连可以做网站的公司北京公司注册最新政策

用Jsp Servlet和Jquery以及SQLServer实现商品管理系统。 采用MVC三层架构进行此程序的开发。 功能分析&#xff1a; 1.登录功能 2.查询和联合查询商品 3.增加商品 4.删除商品 效果演示 登录页面 查询页面 添加商品 点击删除 实现商品管理系统需要数据库和程序两部分。…