【无标题】C#构造函数详解|基础+继承实战(银行账户案例)
一、什么是构造函数
构造函数是与类名同名、没有返回值的特殊方法。 在new创建对象时自动执行,主要用于给对象字段/属性做初始化赋值。
核心规则
- 方法名必须和类名完全一致,不能写void;
- 只能
new的时候自动调用,不能手动调用; - 写了带参构造,编译器就不再自动生成默认无参构造。
public class Account { //带参构造函数 public Account(string id,string name,decimal balance) { AccountId = id; OwnerName = name; Balance = balance; } public string AccountId { get; set; } public string OwnerName { get; set; } public decimal Balance { get; set; } } //创建对象,自动执行构造函数 Account acc = new Account("A001","张三",1000);二、构造函数常见类型
1. 默认无参构造
如果类不写任何构造函数,编译器偷偷生成一个public 类名(){}无参构造。
⚠️只要手写任意带参构造,默认无参构造就消失,想要用就得手动写。
2. 带参构造函数
实例化的时候直接传入初始数据,项目开发最常用。
3. 构造函数重载
一个类可以有多个构造函数,参数列表不同即可构成重载。
public Account(){} public Account(string id):this(id,"未知",0){} public Account(string id,string name,decimal balance){}4. this():调用本类其他构造
this(参数)调用当前类别的其他构造,必须放在第一行,减少重复代码。
public Account(string id):this(id,"匿名用户",0) { }三、继承中的构造函数 base()【重点】
- 创建子类对象时,会先调用父类构造,再执行子类构造。
- 如果父类没有无参构造,子类必须用
base(参数)显式调用父类带参构造,否则编译报错。 base()同样只能写在构造函数第一行。
银行账户案例(抽象父类+子类)
public abstract class Account { public string AccountId { get; set; } public string OwnerName { get; set; } public decimal Balance { get; set; } //父类带参构造,没有无参构造 public Account(string id, string name, decimal balance) { AccountId = id; OwnerName = name; Balance = balance; } } //储蓄账户子类 public class SavingsAccount : Account { public double Rate { get; set; } //base调用父类构造,把公共参数传给父类 public SavingsAccount(string id, string name, decimal balance, double rate) : base(id, name, balance) { Rate = rate;//子类自己独有的字段初始化 } }抽象类不能new实例,但可以写构造函数,专门供子类通过base调用。
四、执行顺序
父类实例构造 → 子类实例构造
静态构造函数优先执行,整个程序生命周期只跑一次。
五、高频踩坑小结
- 写了带参构造,无参构造就没了,需要就手动添加;
- 继承父类只有带参构造,子类必须写
base(xxx); this()和base()只能写在构造函数第一行;- 构造函数不能加virtual、override、static修饰;
- 构造函数尽量只做初始化,不要写复杂业务逻辑。
六、小总结
构造函数是面向对象初始化的核心:
this():调用本类其他构造;base():子类调用父类构造;- 抽象类可以有构造,服务子类继承初始化。
文章到这里,如果对你有帮助,欢迎点赞收藏~
