> 技术文档 > 【C#学习Day10笔记】面向对象、构造函数、属性、析构函数

【C#学习Day10笔记】面向对象、构造函数、属性、析构函数


前言

在C#第十天的学习中,我深入探索了面向对象编程的核心三大特性:​封装继承多态。本文系统整理了我对这些概念的理解与实践,通过真实代码示例展示如何创建类、使用属性、构造函数和析构函数。所有示例代码都来自我的课堂实践,保留原始命名和实现逻辑,帮助大家系统掌握面向对象编程精髓!


一、类与对象:面向对象的基石

1. 类与对象的关系


2. 创建类与对象

// Dog类定义class Dog{ public string name = \"阿黄\"; public const string Color = \"黄色\"; public void Run() { Console.WriteLine(\"奔跑\"); }}// 创建对象Dog d1 = new Dog(); // 第一条狗Dog d2 = new Dog(); // 第二条狗// 操作对象d1.name = \"小黄\";Console.WriteLine(d1.name); // 输出:小黄d1.Run(); // 输出:奔跑

二、封装:数据保护的核心

1. 访问修饰符详解

修饰符​ ​访问权限​ ​示例代码public 无限制访问 public int age; private 仅类内访问 private string name; internal 同程序集访问 internal int id; protected 类内及子类访问 protected int score;

2. Get/Set方法实现封装

class Student{ private string name; public void SetName(string name) { this.name = name; } public string GetName() { return this.name; }}// 使用示例Student stu = new Student();stu.SetName(\"张三\");Console.WriteLine(stu.GetName()); // 输出:张三

三、构造函数:对象初始化

1. 构造函数类型

class Class1{ public int age; public string name; // 无参构造函数 public Class1() { Console.WriteLine(\"无参构造被调用\"); } // 带参构造函数 public Class1(int age, string name) { this.age = age; this.name = name; } public void Show() { Console.WriteLine($\"{name}, {age}岁\"); }}// 使用示例Class1 c1 = new Class1(); // 调用无参构造Class1 c2 = new Class1(20, \"李四\"); // 调用带参构造c2.Show(); // 输出:李四, 20岁

四、属性:封装的高级形式

1. 属性基本结构

class Student{ private int id; public int Id { get { return id; } set { id = value; } }}// 使用示例Student stu = new Student();stu.Id = 123456; // 设置值Console.WriteLine(stu.Id); // 获取值

2. 自动属性与只读属性

// 自动属性public string Addres { get; set; }// 默认值属性public string Phone { get; set; } = \"12345678910\";// 只读属性public int Age { get { return age; } }// 枚举属性public enum Ecolor { 白, 黑, 黄 }public Ecolor Color { get; set; }// 使用示例Dog dog = new Dog();dog.Color = Dog.Ecolor.黑;Console.WriteLine(dog.Color); // 输出:黑

五、析构函数:资源清理

1. 析构函数工作原理

class Student{ public string Name { get; set; } // 析构函数 ~Student() { Console.WriteLine($\"{Name}被释放\"); Name = null; }}// 使用示例static void Main(){ Student stu = new Student() { Name = \"张三\" }; stu = null; // 取消引用 GC.Collect(); // 手动触发垃圾回收 // 输出:张三被释放}

2. 垃圾回收关键点

  1. 触发时机​:内存不足时自动执行
  2. 手动触发​:GC.Collect()(慎用)
  3. 析构顺序​:无法精确控制执行时间
  4. 资源释放​:主要清理非托管资源

六、综合案例:完整类设计

学生管理系统核心类

public class Student{ // 字段(私有封装) private string _id; // 属性 public string Name { get; set; } public int Age { get; set; } // 只读属性 public string ID { get { return _id; } } // 构造函数 public Student(string name, int age) { Name = name; Age = age; _id = GenerateID(); } // 私有方法 private string GenerateID() { return Guid.NewGuid().ToString().Substring(0, 8); } // 析构函数 ~Student() { Console.WriteLine($\"学生{Name}资源已释放\"); } // 公开方法 public void PrintInfo() { Console.WriteLine($\"{Name}({Age}岁), 学号:{ID}\"); }}// 使用示例Student stu = new Student(\"王五\", 20);stu.PrintInfo();// 输出:王五(20岁), 学号:3a7b4f2c

学习总结

面向对象三大特性

特性​ ​核心概念​ ​代码体现​ 封装 隐藏实现细节 private字段 + public属性 继承 代码复用与扩展 类继承(下节课内容) 多态 同一操作不同实现 方法重写(下节课内容)

关键编程技巧

  1. 类设计原则​:

    • 单一职责原则
    • 高内聚低耦合
    • 优先组合而非继承
  2. 属性使用场景​:

    • 需要验证逻辑时
    • 需要计算值时
    • 需要访问控制时
  3. 构造函数最佳实践​:

    • 初始化所有必要字段
    • 避免复杂逻辑
    • 提供合理的重载
  4. 资源管理注意​:

    • 优先使用using而非析构函数
    • 及时释放非托管资源
    • 避免手动调用GC.Collect()

编程箴言
\"优秀的面向对象设计不是添加更多功能,而是合理划分责任边界\"

学习路线建议​:

  1. 掌握类与对象的基本操作
  2. 深入理解封装的意义与实现
  3. 熟练使用属性替代公共字段
  4. 理解构造函数与析构函数的生命周期
  5. 为下节课的继承与多态做准备