当前位置: 首页 > news >正文

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

导言

在面向对象编程中,理解对象构造过程至关重要。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.hskmm.com/?act=detail&tid=25472

相关文章:

  • 英语_阅读_Let your baby go_待读
  • 第三章习题
  • 系统管理员的日常困境与幽默自嘲
  • AI数据标注平台获融资挑战行业巨头
  • 详细介绍:如何用 pnpm patch 给 element-plus 打补丁修复线上 bug(以 2.4.4 修复 PR#15197 为例)
  • Numericaltables1
  • ARC 207
  • 半年小结 Vol4. 跌跌撞撞开启 PhD 生涯
  • 深入解析:C++:内存管理
  • 大数求余
  • visual studio 无法打开文件
  • 基于MPPT算法的光伏并网发电系统simulink建模与仿真
  • 实用指南:【系统架构设计师】2025年上半年真题论文回忆版: 论系统负载均衡设计方法(包括解题思路和参考素材)
  • 软件版悟空博弈+WAUC构筑元人文演化之路研究报告——声明Ai研究
  • QBXT2025S刷题 Day5题
  • [KaibaMath1001] 关于∀ε0,|a-b|ε = a=b的证明
  • 基于Web的分布式图集管理系统架构设计与实践 - 教程
  • TCP小结 - 指南
  • 国庆 Day2 强基物理
  • ZR 2025 十一集训 Day 6
  • 软件版悟空博弈 + WAUC:构筑元人文的演化之路
  • 基于MVO多元宇宙优化的DBSCAN聚类算法matlab仿真
  • AirSim 安装过程记录 - zzh
  • LARAVEL安装报错:Illuminate\Database\QueryException could not find driver (Connection: sqlite, SQL:
  • 基于AXI模块的视频流传输(硬件连接篇)
  • [GDOUCTF 2023]泄露的伪装
  • 仿射密码
  • AtCoder Regular Contest 207 (Div.1) 游记
  • 深入解析:AI破局:饿了么如何搅动即时零售江湖
  • 从零开始学Flink:数据输出的终极指南