C#构造函数 + 析构函数

一、构造函数 核心概念(必考)

1. 定义特点

  • 方法名必须和类名完全一致

  • 没有返回值(连void都不写)

  • new 对象的一瞬间自动执行

  • 作用:创建对象、初始化字段/属性数据

2. 默认构造函数

如果类中不写任何构造函数 ,编译器会自动赠送一个 无参空构造函数

一旦手写了有参构造,编译器不再赠送默认无参构造


二、两种构造函数实战

1. 无参构造函数

new 对象不传参数时执行,用于统一默认初始化数据

cs 复制代码
public class People
{
    public string Name { get; set; }
    public int Age { get; set; }

    //无参构造函数
    public People()
    {
        Name = "张三";
        this.Age = 10;
    }
}

测试结果:

cs 复制代码
People p1 = new People();
Console.WriteLine(p1.Name); //张三

People p2 = new People();
Console.WriteLine(p2.Name); //张三

2. 有参构造函数

用于 创建对象时自定义初始化数据

cs 复制代码
//有参构造函数
public People(string n, int a)
{
    this.Name = n;  
    this.Age = a;
    Console.WriteLine(this.Name + "---------");
}

测试结果:

cs 复制代码
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:就近原则,优先方法内部参数

cs 复制代码
public People(string Age, int a)
{
    this.Age = Age; 
    // this.Age:对象属性
    // Age:方法参数
}

五、析构函数(终结器)

1. 语法格式

前缀加 ~,无返回值、无参数、不能重载

cs 复制代码
public class People
{
    //析构函数
    ~People()
    {
        Console.WriteLine("对象被GC回收");
    }
}

2. 执行时机

当对象 没有任何变量引用 时,GC垃圾回收机制会回收对象,触发析构函数。

3. 手动强制GC回收

cs 复制代码
People p = new People();
p = null;           // 断开引用,对象变成垃圾
GC.Collect();       // 强制触发垃圾回收
Console.ReadKey();

4. 析构函数特点

  • 由系统自动调用,无法手动调用

  • 作用:释放资源、清理内存

  • 无法重载、无参无返回值


六、构造函数 VS 析构函数 对比(必背)

对比 构造函数 析构函数
执行时机 new 对象时 自动执行 对象被GC回收时 自动执行
作用 创建对象、初始化数据 销毁对象、释放资源
语法 和类名同名 类名前加 ~
是否可重载 可以重载(多个构造) 不可重载,只能一个

七、终极总结口诀

  • 构造生对象,析构毁对象

  • 无参构造初始化默认值,有参构造自定义赋值

  • this 区分参数和属性重名,指代当前对象

  • p=null 断开引用,GC.Collect() 强制回收

  • 手写有参构造,编译器不再提供默认无参构造

相关推荐
梦想的旅途229 分钟前
Python实现企业微信文本消息发送
开发语言·python·企业微信
大鹏说大话1 小时前
美业微信会员系统哪个好
开发语言
半亩码田2 小时前
C#转Python第3.6篇:Python 的 @property 比 C# 的 get/set 更灵活
java·python·c#
程序员与背包客_CoderZ2 小时前
高性能分布式KV存储引擎RocksDB入门与C/C++编码实战
c语言·开发语言·数据库·c++·分布式·分布式数据库·rocksdb
钱栈up2 小时前
Mac 开发机一键发版不用切环境:我这样改造了团队的后端部署脚本Maven编译卡住20分钟?我靠两步定位到2处隐蔽编译错误
开发语言·python·macos
william_yangshun2 小时前
【大模型部署实战】kimi-k3-in-c 中文版:用 176KB 纯 C99 引擎在 CPU 上跑 Kimi K3 上手指南
c语言·开发语言
Sagittarius_A*2 小时前
Burst Lab | PHP 审计 14|反序列化(四):字符串逃逸与绕过技巧
开发语言·安全·php·web·反序列化
名字还没想好☜2 小时前
Go 用 slices/maps 标准库泛型函数:告别手写 Contains、Sort、去重(Go 1.21)
开发语言·后端·算法·golang·go
淼澄研学2 小时前
Python实战:基于LangChain与Chroma构建企业级RAG知识库问答系统
开发语言·python·langchain
4311媒体网3 小时前
帝国CMS网站自定义搭建技巧
服务器·开发语言·前端