首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >第四章:C# 面向对象编程详解:从类与对象到完整项目实践

第四章:C# 面向对象编程详解:从类与对象到完整项目实践

作者头像
云中小生
发布2025-11-15 12:07:55
发布2025-11-15 12:07:55
1060
举报

C# 面向对象编程详解:从类与对象到完整项目实践

4.1 类(Class)与对象(Object)的概念

核心概念解析

类(Class) 是面向对象编程的蓝图或模板,它定义了:

  • 数据成员:字段和属性,用于存储对象状态
  • 行为成员:方法,定义对象能执行的操作
  • 构造机制:构造函数,用于创建和初始化对象

对象(Object) 是类的具体实例,是根据类定义创建的现实实体。

类与对象关系流程图
类与对象关系流程图

类与对象关系流程图

现实世界类比

代码语言:javascript
复制
// 类:就像汽车的设计图纸
classCar
{
    // 属性:颜色、品牌、速度等
    publicstring Color { get; set; }
    publicstring Brand { get; set; }
    
    // 方法:启动、加速、刹车等
    public void Start() { /* 启动逻辑 */ }
    public void Accelerate() { /* 加速逻辑 */ }
}

// 对象:就像根据图纸制造的具体汽车
Car myCar = new Car();      // 我的汽车
Car yourCar = new Car();    // 你的汽车

第一个完整的类示例

代码语言:javascript
复制
using System;

// 定义一个Person类
classPerson
{
    // 字段 - 存储数据
    publicstring name;
    publicint age;
    
    // 方法 - 定义行为
    public void Introduce()
    {
        Console.WriteLine($"你好,我叫{name},今年{age}岁。");
    }
}

classProgram
{
    static void Main()
    {
        // 创建Person类的对象(实例化)
        Person person1 = new Person();
        person1.name = "张三";
        person1.age = 25;
        person1.Introduce();  // 输出:你好,我叫张三,今年25岁。
        
        Person person2 = new Person();
        person2.name = "李四";
        person2.age = 30;
        person2.Introduce();  // 输出:你好,我叫李四,今年30岁。
    }
}

4.2 字段(Field)与属性(Property)

字段(Field)

字段是直接在类中声明的变量,用于存储对象的状态数据。

代码语言:javascript
复制
class Student
{
    // 公共字段 - 通常使用小写字母开头
    publicstring name;
    publicint age;
    
    // 私有字段 - 只能在类内部访问
    privatedouble gpa;
    
    // 静态字段 - 属于类本身,所有实例共享
    privatestaticint studentCount = 0;
}

属性(Property)

属性提供了对字段的安全访问机制,可以添加验证逻辑。

属性访问流程图
属性访问流程图

属性访问流程图

完整属性(Full Property)
代码语言:javascript
复制
class BankAccount
{
    privatedouble balance;  // 私有字段
    
    // 属性 - 提供对balance字段的受控访问
    publicdouble Balance
    {
        get { return balance; }  // 读取值
        set
        { 
            // 添加验证逻辑
            if (value >= 0)
                balance = value;
            else
                Console.WriteLine("余额不能为负数!");
        }
    }
    
    privatestring accountNumber;
    
    // 只读属性
    publicstring AccountNumber
    {
        get { return accountNumber; }
    }
}
自动属性(Auto Property)

当不需要额外逻辑时,可以使用简洁的自动属性:

代码语言:javascript
复制
class Product
{
    // 自动属性 - 编译器自动生成私有字段
    publicstring Name { get; set; }
    publicdecimal Price { get; set; }
    publicint Stock { get; set; }
    
    // 只读自动属性(只能在构造函数中设置)
    publicstring Category { get; }
    
    // 带有不同访问级别的属性
    publicstring InternalCode { get; privateset; }
}

字段与属性的使用场景对比

代码语言:javascript
复制
class Employee
{
    // 字段 - 用于内部计算,不需要外部访问
    private DateTime hireDate;
    privateint workingYears;
    
    // 属性 - 需要验证或计算的公共数据
    privatestring _name;
    publicstring Name
    {
        get { return _name; }
        set
        { 
            if (!string.IsNullOrWhiteSpace(value))
                _name = value.Trim();
            else
                thrownew ArgumentException("姓名不能为空");
        }
    }
    
    // 计算属性(只有getter)
    publicbool IsEligibleForPromotion
    {
        get { return workingYears >= 3; }
    }
    
    // 自动属性
    publicstring Department { get; set; }
}

4.3 方法(Method)

方法的基本定义

方法是类中定义行为的方式,包含执行特定任务的语句块。

代码语言:javascript
复制
class Calculator
{
    // 无参数无返回值的方法
    public void ShowWelcome()
    {
        Console.WriteLine("欢迎使用计算器!");
    }
    
    // 有参数无返回值的方法
    public void PrintMessage(string message)
    {
        Console.WriteLine($"消息:{message}");
    }
    
    // 有参数有返回值的方法
    public int Add(int a, int b)
    {
        return a + b;
    }
    
    // 多个参数的方法
    public double CalculateBMI(double weight, double height)
    {
        return weight / (height * height);
    }
}
方法调用执行流程图
方法调用执行流程图

方法调用执行流程图

方法重载(Overload)

同一个类中可以有多个同名方法,只要参数列表不同:

代码语言:javascript
复制
class MathOperations
{
    // 整数相加
    public int Add(int a, int b)
    {
        return a + b;
    }
    
    // 浮点数相加 - 参数类型不同
    public double Add(double a, double b)
    {
        return a + b;
    }
    
    // 三个数相加 - 参数数量不同
    public int Add(int a, int b, int c)
    {
        return a + b + c;
    }
}
方法重载解析流程图
方法重载解析流程图

方法重载解析流程图

参数传递方式

代码语言:javascript
复制
class ParameterDemo
{
    // 值传递 - 传递参数的副本
    public void IncrementValue(int number)
    {
        number++;
        Console.WriteLine($"方法内: {number}");
    }
    
    // 引用传递 - 使用ref关键字
    public void IncrementRef(ref int number)
    {
        number++;
        Console.WriteLine($"方法内: {number}");
    }
    
    // 输出参数 - 使用out关键字
    public void GetUserInfo(out string name, out int age)
    {
        name = "张三";  // 必须赋值
        age = 25;      // 必须赋值
    }
}

4.4 构造函数与析构函数

构造函数(Constructor)

构造函数在创建对象时自动调用,用于初始化对象。

代码语言:javascript
复制
class Book
{
    publicstring Title { get; set; }
    publicstring Author { get; set; }
    publicdecimal Price { get; set; }
    
    // 默认构造函数
    public Book()
    {
        Title = "未知";
        Author = "未知";
        Price = 0;
    }
    
    // 参数化构造函数
    public Book(string title, string author, decimal price)
    {
        Title = title;
        Author = author;
        Price = price;
    }
    
    // 构造函数重载
    public Book(string title, string author) : this(title, author, 0)
    {
        // 使用this调用其他构造函数
    }
}
对象生命周期流程图
对象生命周期流程图

对象生命周期流程图

静态构造函数

静态构造函数用于初始化类的静态成员。

代码语言:javascript
复制
class Configuration
{
    publicstaticstring DatabaseConnection { get; privateset; }
    publicstatic DateTime InitializeTime { get; privateset; }
    
    // 静态构造函数
    static Configuration()
    {
        DatabaseConnection = "Server=localhost;Database=MyApp;";
        InitializeTime = DateTime.Now;
    }
}

析构函数

代码语言:javascript
复制
class ResourceManager
{
    privatestring resourceName;
    
    public ResourceManager(string name)
    {
        resourceName = name;
    }
    
    // 析构函数
    ~ResourceManager()
    {
        Console.WriteLine($"资源 '{resourceName}' 正在被清理");
        // 释放非托管资源
    }
}

注意:在现代C#中,通常使用 IDisposable 接口而不是析构函数来管理资源。


4.5 📝 动手练习

练习1:银行账户类

代码语言:javascript
复制
class BankAccount
{
    publicstring AccountNumber { get; }
    publicstring Owner { get; set; }
    publicdecimal Balance { get; privateset; }
    
    // 静态字段
    privatestaticint accountCount = 0;
    
    public BankAccount(string owner, decimal initialBalance = 0)
    {
        AccountNumber = GenerateAccountNumber();
        Owner = owner;
        Balance = initialBalance;
        accountCount++;
    }
    
    public void Deposit(decimal amount)
    {
        if (amount <= 0)
        {
            Console.WriteLine("存款金额必须大于0");
            return;
        }
        
        Balance += amount;
        Console.WriteLine($"成功存款 {amount:C},当前余额: {Balance:C}");
    }
    
    public void DisplayInfo()
    {
        Console.WriteLine("=== 账户信息 ===");
        Console.WriteLine($"账号: {AccountNumber}");
        Console.WriteLine($"户主: {Owner}");
        Console.WriteLine($"余额: {Balance:C}");
    }
    
    private string GenerateAccountNumber()
    {
        return"ACC" + DateTime.Now.ToString("yyyyMMddHHmmss");
    }
}
银行账户操作流程图
银行账户操作流程图

银行账户操作流程图

练习2:学生成绩管理系统学生类

代码语言:javascript
复制
class Student
{
    publicstring StudentId { get; }
    publicstring Name { get; set; }
    privatedouble[] grades;
    
    // 计算属性
    publicdouble GPA 
    { 
        get
        {
            if (grades.Length == 0) return0;
            return grades.Average();
        } 
    }
    
    public Student(string studentId, string name)
    {
        StudentId = studentId;
        Name = name;
        grades = newdouble[0];
    }
    
    public void AddGrade(double grade)
    {
        Array.Resize(ref grades, grades.Length + 1);
        grades[grades.Length - 1] = grade;
    }
    
    public void DisplayInfo()
    {
        Console.WriteLine($"学号: {StudentId}, 姓名: {Name}, 平均分: {GPA:F1}");
    }
}
学生成绩管理流程图
学生成绩管理流程图

学生成绩管理流程图

练习3:游戏角色战斗系统游戏角色类

代码语言:javascript
复制
class GameCharacter
{
    publicstring Name { get; }
    publicint Health { get; privateset; }
    publicbool IsAlive => Health > 0;
    
    public GameCharacter(string name)
    {
        Name = name;
        Health = 100;
    }
    
    public void Attack(GameCharacter target)
    {
        if (!IsAlive || !target.IsAlive) return;
        
        int damage = 20;
        target.TakeDamage(damage);
        Console.WriteLine($"{Name} 攻击了 {target.Name}");
    }
    
    public void TakeDamage(int damage)
    {
        Health -= damage;
        if (Health < 0) Health = 0;
    }
}
游戏战斗系统流程图
游戏战斗系统流程图

游戏战斗系统流程图

💡 重点回顾

  • 类与对象:类是蓝图,对象是具体实例
  • 封装性:使用访问修饰符控制成员可见性
  • 字段与属性:字段存储数据,属性提供安全访问
  • 方法重载:同名方法,不同参数列表
  • 构造函数:初始化对象,支持重载
  • 静态成员:属于类本身,所有实例共享
面向对象核心概念关系图
面向对象核心概念关系图

面向对象核心概念关系图

🎯 综合项目挑战:图书馆管理系统

创建一个完整的图书馆管理系统,包含以下功能:

核心类设计

Book类

  • 属性:ISBN、书名、作者、出版年份、是否借出
  • 方法:借书、还书、显示信息

Member类

  • 属性:会员ID、姓名、借书列表
  • 方法:借书、还书、显示借阅历史

Library类

  • 属性:图书列表、会员列表
  • 方法:添加图书、搜索图书、统计信息
图书馆系统架构图
图书馆系统架构图

图书馆系统架构图

高级功能

  • 使用静态成员跟踪总数
  • 实现多条件图书搜索
  • 添加借书限制(最多5本)
  • 实现逾期罚款系统

图书借阅流程

图书借阅流程
图书借阅流程

图书借阅流程

通过这个完整的项目,你将全面掌握C#面向对象编程的核心概念和实践技能!

4.6 附录

教程源码已上传网盘,需要请自取

  • 【第四章:C# 面向对象编程详解:从类与对象到完整项目实践教程(夸克)】 https://pan.quark.cn/s/53e50b9b444d?pwd=Drpe
  • 【第四章:C# 面向对象编程详解:从类与对象到完整项目实践教程(迅雷)】 https://pan.xunlei.com/s/VOdiYajn_gITGdvjbMBgV20yA1?pwd=8qmf#
  • 【教程源码合集,跟随文章更新而更新】(夸克) https://pan.quark.cn/s/45f6daaa146c?pwd=hhEn
  • 【教程源码合集,跟随文章更新而更新】(迅雷) https://pan.xunlei.com/s/VOdiYw4TJOrQftxduolTMmgBA1?pwd=m9s3#
  • 【C#入门课程52课视频教程】(迅雷) https://pan.xunlei.com/s/VOdiZIMdNx9tck9hrXpqA090A1?pwd=sqy7#
  • 【C#入门课程52课视频教程】(夸克) https://pan.quark.cn/s/ea5ff33d6486?pwd=CuMY
  • 【Visual Studio安装包合集】 https://pan.quark.cn/s/086c08df84ec?pwd=gKrP
  • 【SQL Server安装包合集(2008R2—2019)】 https://pan.xunlei.com/s/VOdiZ5MRboILxVkF9Ag3Pyr4A1?pwd=u68h#

(点击关注,修炼不迷路👇

▌转载请注明出处,渡人渡己

🌟 感谢道友结缘! 若本文助您突破修为瓶颈,不妨【打赏灵丹】或【转发功德】,让更多道友共参.NET天道玄机。修真之路漫漫,我们以代码为符,共绘仙途!

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2025-11-13,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 .NET修仙日记 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • C# 面向对象编程详解:从类与对象到完整项目实践
    • 4.1 类(Class)与对象(Object)的概念
      • 核心概念解析
      • 现实世界类比
      • 第一个完整的类示例
    • 4.2 字段(Field)与属性(Property)
      • 字段(Field)
      • 属性(Property)
      • 字段与属性的使用场景对比
    • 4.3 方法(Method)
      • 方法的基本定义
      • 方法重载(Overload)
      • 参数传递方式
    • 4.4 构造函数与析构函数
      • 构造函数(Constructor)
      • 静态构造函数
      • 析构函数
    • 4.5 📝 动手练习
      • 练习1:银行账户类
      • 练习2:学生成绩管理系统学生类
      • 练习3:游戏角色战斗系统游戏角色类
    • 💡 重点回顾
    • 🎯 综合项目挑战:图书馆管理系统
      • 核心类设计
      • 高级功能
      • 图书借阅流程
    • 4.6 附录
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档