平时做技术实践时,很多问题不是概念不会,而是细节没串起来。拿“C#构造函数 + 析构函数的实现方法”来说,它看着像小点,放到项目里常会牵出环境、配置、兼容性和维护成本。下面按实际采用顺序,把思路、关键写法和容易踩坑的地方讲清楚,便于大家直接对照操作。
一、构造函数 核心概念(必考)
1. 定义特点
- 方法名必须和类名完全一致
- 没有得到值(连void都不写)
- 在 new 对象的一瞬间自动执行
- 作用:新建对象、初始化字段/属性数据
2. 默认构造函数
如果类中不写任何构造函数,编译器会自动赠送一个 无参空构造函数。
一旦手写了有参构造,编译器不再赠送默认无参构造。
二、两种构造函数实战
1. 无参构造函数
new 对象不传参数时执行,用来统一默认初始化数据
public class People
{
public string Name { get; set; }
public int Age { get; set; }
//无参构造函数
public People()
{
Name = "张三";
this.Age = 10;
}
}
测试结果:
People p1 = new People();
Console.WriteLine(p1.Name); //张三
People p2 = new People();
Console.WriteLine(p2.Name); //张三
2. 有参构造函数
用来 新建对象时自定义初始化数据
//有参构造函数
public People(string n, int a)
{
this.Name = n;
this.Age = a;
Console.WriteLine(this.Name + "---------");
}
测试结果:
People p3 = new People("李四", 20);
Console.WriteLine(p3.Name); //李四
People p4 = new People("王五", 20);
Console.WriteLine(p4.Name); //王五
三、构造函数重载
一个类中多个构造函数共存(参数个数/参数类型不同)
- People() → 无参构造
- People(string n, int a) → 双参构造
优势:新建对象灵活,想默认初始化就无参、想自定义就有参
四、this 关键字 核心作用
this 代表当前类的当前实例对象
- 区分:局部参数 和 全局属性/字段 重名问题
this.Age:代表当前对象的 Age 属性Age:就近原则,优先方法内部参数
public People(string Age, int a)
{
this.Age = Age;
// this.Age:对象属性
// Age:方法参数
}
五、析构函数(终结器)
1. 语法格式
前缀加 ~,无得到值、无参数、不能重载
public class People
{
//析构函数
~People()
{
Console.WriteLine("对象被GC回收");
}
}
2. 执行时机
当对象 没有任何变量引用 时,GC垃圾回收机制会回收对象,触发析构函数。
3. 手动强制GC回收
People p = new People();
p = null; // 断开引用,对象变成垃圾
GC.Collect(); // 强制触发垃圾回收
Console.ReadKey();
4. 析构函数特点
- 由系统自动调用,无法手动调用
- 作用:释放资源、清理内存
- 无法重载、无参无得到值
六、构造函数 VS 析构函数 对比(必背)
对比 | 构造函数 | 析构函数 |
|---|---|---|
执行时机 | new 对象时 自动执行 | 对象被GC回收时 自动执行 |
作用 | 新建对象、初始化数据 | 销毁对象、释放资源 |
语法 | 和类名同名 | 类名前加 ~ |
是否可重载 | 能够重载(多个构造) | 不可重载,只能一个 |
七、终极总结口诀
- 构造生对象,析构毁对象
- 无参构造初始化默认值,有参构造自定义赋值
- this 区分参数和属性重名,指代当前对象
- p=null 断开引用,GC.Collect() 强制回收
- 手写有参构造,编译器不再提供默认无参构造
从实现思路看,总的来说,C#构造函数适合结合实际项目边做边理解。先抓住核心思路,再逐步补上细节和边界处理,最后效果会更稳定,也更容易复用。
