当前位置: 首页 > 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.zskr.cn/news/16478.html

相关文章:

  • 大数求余
  • QBXT2025S刷题 Day5题
  • Linux 中 m、mm、mmm 函数和 make 的区别 - 详解
  • 详细介绍:学习STC51单片机27(芯片为STC89C52RCRC)
  • ZR 2025 十一集训 Day 6
  • Linux或者Windows下PHP版本查看便捷的方法总结
  • 线性表的顺序存储和链式存储
  • US$34.2 KEYDIY KD B27-3 Universal Flip Remote 3 Buttons for Audi Type 5pcs/lot
  • 点乘与叉乘的由来:从四元数到公理自洽的启示
  • 面试题——计算机网络:HTTP和HTTPS的区别? - 教程
  • C# Avalonia 16- Animation- RotateButton
  • 详细介绍:python第31天打卡
  • 如何采用插件和子主题添加WordPress自定义CSS(附:常见错误)
  • 02020502 EF Core高级02-IQuerable会延迟执行、分部和动态构建IQuerable、IQuerable的复用
  • 在 PyCharm 中,环境:bert_env , 执行 import wandb 报错。但是,在CMD窗口,环境:bert_env , 执行 import wandb 正常。
  • Linux_T(Sticky Bit)粘滞位详解 - 详解
  • Valley靶机渗透实战:从凭证复用到Python库劫持
  • 深入解析:IP Search Performance Tests dat/db/xdb/mmdb 结构性能差异对比
  • 10.05模拟赛反思
  • 如何快速搭建spring-boot工程 - murphy
  • 做题记录 #1
  • 深度学习优化器算法巧思速览
  • 在Windows下使用lucky实现TLS/SSL证书自动化
  • CF700E
  • 价值弥漫:“AI元人文”的场域革命与共生之路
  • k8s之pod概念
  • 鸿蒙版Taro 搭建开发环境 - 教程
  • CF 1055 Div.1+Div.2
  • 2026 NOI 做题记录(五)
  • “齐俊杰投资智能体”更新完了9月份的资料