c#面向对象程序设计

一、面向对象与面向过程的核心区别(概念铺垫)

代码背景

开篇对比了两种编程范式:

  • 面向过程(PP):按步骤分解问题(如 “输入长→输入宽→计算面积”);

  • 面向对象(OOP):将问题抽象为 “对象”,通过对象的属性和行为解决问题(如 “矩形对象” 有长、宽属性和计算面积的方法)。

补充知识点
  • 编程范式:是解决问题的 “方法论”,OOP 更适合复杂系统(可维护性、复用性强),PP 适合简单流程(如脚本工具)。

  • 对象的核心特征状态(属性)行为(方法) 的封装。例如 “人” 的属性是姓名、年龄,行为是吃饭、睡觉。

二、类与对象的基础定义(Rectangle 类示例)

代码解析
class Rectangle  // 类定义
{public int Length;  // 属性(字段)public int Width;   public int Area()  // 方法{return Length * Width;}
}
​
// 实例化对象并使用
Rectangle rectangle = new Rectangle();  
rectangle.Length = 5;  
rectangle.Width = 3;  
Console.WriteLine(rectangle.Area());  // 输出15
补充知识点
  • 类的本质:“模板” 或 “蓝图”,定义对象的 “能有什么”(属性)和 “能做什么”(方法)。

  • 对象的实例化new 类名() 是创建对象的语法,本质是在内存中分配空间,初始化属性。

  • 成员访问:通过 对象.成员 访问属性或调用方法,体现对象的 “自主性”。

三、类的创建与结构(People 类示例)

代码解析
class People  // 类定义(默认internal修饰符)
{string name;  // 私有字段(默认private)int age;      void eat()    // 私有方法{Console.WriteLine("吃饭");}
}
补充知识点
  • 类的结构三要素:

    • 字段(成员变量):存储对象的状态(如nameage);

    • 方法:定义对象的行为(如eat());

    • 访问修饰符:控制成员的可访问范围(核心是封装)。

  • 访问修饰符作用:

    • public:任何地方可访问(如对外暴露的接口);

    • private:仅类内部可访问(如内部计算的临时变量);

    • internal:仅当前项目可访问(如项目内共享的工具类)。

访问修饰符 / 范围当前类父类实例对象引用当前项目的项目子类引用当前项目实例对象同一程序集的非子类不同程序集的子类不同程序集的非子类
public
private×××××××
internal××
protected××××
protected internal××
private protected××√ (仅同一程序集)××× (不同程序集)×

四、对象的实例化与成员访问(People 对象示例)

代码解析
// 实例化对象
People p1 = new People();  
p1.name = "吴亦凡";  // 访问公共字段(需先将name改为public)
​
// 对象初始化器(语法糖)
People p2 = new People() { name = "罗志祥" };  
​
// 调用方法
p1.eat();  
People.sleep();  // 调用静态方法
补充知识点
  • 对象初始化器new 类名() { 成员 = 值 } 简化对象属性赋值,本质是先调用构造函数,再赋值。

  • 静态成员访问:静态方法 / 属性属于类本身(如People.sleep()),无需实例化对象,通过类名.成员访问;非静态成员属于对象(如p1.eat()),必须通过实例访问。

五、属性与字段的封装(Student、Dog 类示例)

代码解析
class Student
{private char _sex;  // 私有字段(内部存储)public char Sex     // 公共属性(外部访问接口){get { return _sex; }  // 获取值set                   // 设置值(带验证){if (value == '男' || value == '女')_sex = value;elsethrow new Exception("性别必须是男或女");}}
}
补充知识点
  • 封装的核心体现:用私有字段存储数据,通过公共属性控制访问,避免外部直接修改导致数据混乱(如年龄不能为负、性别只能是男女)。

  • 属性的访问器:

    • get:返回字段值(可添加逻辑,如计算后返回);

    • set:接收外部传入的value(需与属性类型一致),可添加验证逻辑。

  • 字段与属性的本质区别:

    • 字段是 “容器”(直接存数据);

    • 属性是 “接口”(不存数据,通过get/set操作字段,实现数据保护)。

六、构造函数与对象初始化(People 类构造函数示例)

代码解析
class People
{public string Name { get; set; }public int Age { get; set; }
​// 无参构造函数public People(){Console.WriteLine("无参构造执行");}
​// 有参构造函数(重载)public People(string name, int age){Name = name;Age = age;}
}
补充知识点
  • 构造函数作用:对象实例化时自动执行,用于初始化对象(如设置默认值、验证参数)。

  • 构造函数重载:同一类中多个构造函数,参数列表不同(体现多态),满足不同初始化需求(如无参构造用默认值,有参构造自定义值)。

  • 默认构造函数:若未手动定义构造函数,编译器自动生成无参构造;若定义了有参构造,默认无参构造会被覆盖,需手动添加。

七、析构函数与垃圾回收(People 析构函数示例)

代码解析
class People
{~People()  // 析构函数{Console.WriteLine("析构函数执行");}
}
​
// 触发垃圾回收
People p1 = new People();  
p1 = null;  // 解除引用
GC.Collect();  // 强制回收
补充知识点
  • 析构函数作用:对象被垃圾回收(GC)时自动执行,用于释放非托管资源(如文件句柄、数据库连接)。

  • GC 机制:C# 自动管理内存,当对象无引用时,GC 会在合适时机回收内存,析构函数执行时机不可控,因此优先使用IDisposable接口手动释放资源。

八、静态成员与实例成员(People 静态成员示例)

代码解析
class People
{public string Name1 { get; set; }  // 实例属性public static string Name2 { get; set; }  // 静态属性
​public void Test1()  // 实例方法{Console.WriteLine(Name1);  // 可访问实例和静态成员Console.WriteLine(Name2);}
​public static void Test2()  // 静态方法{// Console.WriteLine(Name1);  错误:静态方法不能访问实例成员Console.WriteLine(Name2);  // 只能访问静态成员}
}
补充知识点
  • 静态成员特性:

    • 属于类,所有对象共享一份(如计数器、工具方法);

    • 生命周期与程序一致(程序启动时加载,结束时释放);

    • 静态方法中无this指针(因不依赖对象)。

  • 应用场景:工具类(如Math)、全局配置(如AppConfig)、单例模式等。

九、常量与只读成员(Test 类示例)

代码解析
class Test
{public const int c = 2;  // 常量(编译期确定)public readonly int a = 1;  // 只读字段(运行期确定)
​public Test(){a = 10;  // 只读字段可在构造函数中赋值}
​private string _d = "1";public string D { get => _d; }  // 只读属性(无set)
}
补充知识点
  • const 与 readonly 区别:

    • const:编译时确定值,必须声明时赋值,可用于字段 / 局部变量;

    • readonly:运行时确定值,可在声明或构造函数中赋值,仅用于字段。

  • 只读属性:仅保留get访问器(如D),确保属性只能被读取,无法外部修改,增强封装。

十、继承与派生(People→Student→SamllStudent 示例)

代码解析
// 基类
class People
{public string Name { get; set; }public void Eat() { Console.WriteLine("吃饭"); }
}// 派生类
class Student : People  // 继承语法:派生类:基类
{public string StudentId { get; set; }  // 新增属性public void Study() { Console.WriteLine("学习"); }
}// 继承链:SamllStudent → Student → People → object
class SamllStudent : Student { }
补充知识点
  • 继承核心作用:代码复用(子类继承父类所有成员,除构造函数、析构函数)。

  • C# 继承特性:

    • 单继承:一个类只能直接继承一个基类(避免菱形继承问题);

    • 传递性:SamllStudent间接继承People的成员;

    • 向上转型:People p = new Student()(子类对象可赋值给父类变量,体现多态)。

十一、作业:Aircraft 类的完整封装(综合应用)

代码核心模块解析
public class Aircraft
{// 1. 私有字段(内部存储)private string _brand;private int _loadCapacity;  // 最大装载人数private string _aircraftType;  // 飞机类型private int _currentLoad;  // 当前装载人数// 2. 公共属性(外部访问接口,带验证)public int LoadCapacity{get => _loadCapacity;set{if (value < 0) throw new ArgumentException("最大装载人数不能为负");_loadCapacity = value;CalculateAircraftType();  // 自动计算类型GenerateCurrentLoad();    // 生成当前人数}}public string AircraftType => _aircraftType;  // 只读属性// 3. 构造函数(初始化)public Aircraft(string brand, int loadCapacity){_brand = brand;LoadCapacity = loadCapacity;  // 触发类型计算}// 4. 私有方法(内部逻辑)private void CalculateAircraftType(){_aircraftType = _loadCapacity > 400 ? "大型" : (_loadCapacity > 200 ? "中型" : "小型");}private void GenerateCurrentLoad(){_currentLoad = new Random().Next(1, _loadCapacity + 1);  // 随机生成}// 5. 公共方法(对外行为)public void TakeOff(){Console.WriteLine($"{_brand}起飞,当前装载{_currentLoad}人");}
}
知识点综合应用
  • 封装:通过LoadCapacity属性的set访问器验证输入合法性,确保_loadCapacity不为负。

  • 自动逻辑:设置LoadCapacity时自动触发CalculateAircraftType(根据人数分类型)和GenerateCurrentLoad(随机生成当前人数),体现对象的 “自主性”。

  • 只读属性AircraftType仅暴露get,确保类型由内部逻辑计算,外部无法修改。

  • 构造函数:通过有参构造函数初始化核心属性,简化对象创建流程。

总结

面向对象编程的核心是 “抽象” 与 “封装”:通过类抽象事物的共性,通过对象实例化具体事物,通过访问修饰符、属性、方法控制数据和行为的访问,最终实现高内聚、低耦合的代码设计。Aircraft 类综合应用了字段、属性、构造函数、方法等要素,是面向对象思想的典型实践。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/web/90409.shtml
繁体地址,请注明出处:http://hk.pswp.cn/web/90409.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Kylin V10 4070安装nvidia驱动+CUDA+docker安装

目录 1.系统版本信息 2.安装nvidia驱动 3.CUDA安装 4.docker离线安装 1.系统版本信息 查看一下系统版本&#xff0c;命令为&#xff1a; cat /etc/kylin-release2.安装nvidia驱动 编辑/usr/lib/modprobe.d/dist-blacklist.conf文件 blacklist nvidiafb加#号注释掉 添加…

首家!数巅AskBI通过中国信通院数据分析智能体专项测试

近日&#xff0c;在中国信息通信研究院组织的数据分析智能体&#xff08;Data Agent&#xff09;专项测试中&#xff0c;数巅生成式分析智能体AskBI顺利完成专项测试的全部内容。《数据智能体技术要求》标准及测试简介中国信通院云计算与大数据研究所依托中国通信标准化协会大数…

一些Avalonia与WPF内容的对应关系和不同用法

UIElement、FrameworkElement和ControlWPFAvaloniaUIElementControlFrameworkElementControlControlTemplatedControl在 WPF 中&#xff0c;通过继承 Control 类来创建新的模板控件&#xff0c;而在 Avalonia 中&#xff0c;从 TemplatedControl 继承。在 WPF 中&#xff0c;通…

【REACT18.x】CRA+TS+ANTD5.X封装自定义的hooks复用业务功能

模拟react中的hooks方法&#xff0c;实现自定义的hooks来封装我们需要重复使用的组件&#xff0c;来优化代码。这种hooks也是利用了react的原生hooks来实现我们需要的特定业务&#xff0c;可以返回任何我们需要的值&#xff0c;也可以不返回值&#xff0c;作为一个副作用方法使…

Vue CSR 到 Nuxt 3 SSR 迁移:技术实现与问题解决实录

1. 迁移动机与技术选型1.1 CSR 架构的局限性 基于 Vue 3 和 Vite 构建的客户端渲染 (CSR) 单页应用 (SPA) 提供了良好的开发体验和用户交互流畅性。但是其核心局限在于&#xff1a;搜索引擎优化 (SEO)&#xff1a;初始 HTML 响应仅包含一个根 div 元素&#xff0c;实际内容由 J…

FastGPT + Kymo:解锁企业专属知识库与智能体开发新体验

在信息爆炸的时代&#xff0c;企业如何让知识“活起来”&#xff1f;传统文档库和搜索框早已无法满足需求。FastGPT——基于RAG技术的开源知识库系统&#xff0c;正重新定义企业级知识管理&#xff01; 一、FastGPT是什么&#xff1f; FastGPT是企业构建专属知识库的智能核心…

人形机器人_双足行走动力学:Maxwell模型及在拟合肌腱特性中的应用

一、Maxwell模型及其在拟合肌腱特性中的应用Maxwell模型是经典的粘弹性力学模型之一&#xff0c;由弹簧&#xff08;弹性元件&#xff09;和阻尼器&#xff08;粘性元件&#xff09;串联组成。其在生物力学领域的应用主要聚焦于材料的动态响应&#xff08;如应力松弛和蠕变&…

「iOS」——KVC

源码学习iOS底层学习&#xff1a;KVC 底层原理一、核心 API 与功能特性**常用方法**KVC 设值 底层原理KVC 取值 底层原理自定义KVC设值取值**特性&#xff1a;无隐私访问****原理**四、多元应用场景1. **动态数据处理**&#xff08;1&#xff09;字典转模型&#xff08;2&#…

【Lucene】leafreadercontext逻辑段与segment物理磁盘段的关系

在 Lucene 中&#xff0c;“叶子段”&#xff08;LeafReaderContext&#xff09;和 “segment”&#xff08;物理段&#xff09;在 Lucene 语境下&#xff0c;LeafReaderContext ≈ segment 的运行时只读视图。概念 所在层次 含义 是否一一对应 segment 物理存储层 Lucene 索引…

Python进阶第三方库之Matplotlib

应用Matplotlib的基本功能实现图形显示 应用Matplotlib实现多图显示 应用Matplotlib实现不同画图种类 1、什么是Matplotlib是专门用于开发2D图表(包括3D图表) 以渐进、交互式方式实现数据可视化 2、为什么要学习Matplotlib可视化是在整个数据挖掘的关键辅助工具&#xff0c;可以…

【深度解析】从AWS re_Invent 2025看云原生技术发展趋势

2025 年 6 月 28 日 在科技浪潮持续翻涌的当下&#xff0c;云原生技术已然成为推动企业数字化转型与创新发展的关键力量。而 AWS re:Invent 作为云计算领域一年一度的盛会&#xff0c;向来是展示前沿技术、洞察行业趋势的重要舞台。在今年的 AWS re:Invent 2025 大会上&#xf…

高亮标题里的某个关键字正则表达式

使用v-html渲染&#xff0c;写一个高亮方法<span class"title-name" v-html"highlightKeywords(name, keywords)"></span>这里传入的name带了文件拓展名&#xff0c;所以先把名称从文件名里提取出来// 高亮标题颜色highlightKeywords(name, ke…

视频编解码中colorspace,color_range,color_trc,color_primaries,是做什么用的,是谁来指定的

在视频编解码中&#xff0c;colorspace&#xff08;色彩空间&#xff09;、color_range&#xff08;色域范围&#xff09;、color_trc&#xff08;传输特性&#xff09;、color_primaries&#xff08;原色&#xff09;是一组色彩相关元数据&#xff0c;它们共同决定了视频的颜色…

【QT】 Qt背景介绍与概述

文章目录&#x1f4dd;Qt背景介绍&#x1f320; 什么是Qt&#x1f309;Qt的发展史&#x1f320; Qt⽀持的平台&#x1f309; Qt版本&#x1f309; Qt的优点&#x1f309; Qt的应⽤场景&#x1f320; Qt的成功案例&#x1f320; Qt的发展前景及就业分析&#x1f6a9;总结&#x…

如何将拥有的域名自定义链接到我的世界服务器(Minecraft服务器)

关于Dynadot Dynadot是通过ICANN认证的域名注册商&#xff0c;自2002年成立以来&#xff0c;服务于全球108个国家和地区的客户&#xff0c;为数以万计的客户提供简洁&#xff0c;优惠&#xff0c;安全的域名注册以及管理服务。 Dynadot平台操作教程索引&#xff08;包括域名邮…

2025暑期—07深度学习应用-总结

人有自动选取卷积核的能力&#xff0c;传统的图像处理不能自动选取卷积核非线性作用函数&#xff0c;Sigmoid由于梯度消失使用Relu。卷积神经网络的卷积核是未知的&#xff0c;自适应的。其中的权重是不断变化的&#xff0c;就是卷积核是不断变化的。卷积模糊了&#xff0c;池化…

数据结构-4(常用排序算法、二分查找)

一、思维导图二、冒泡排序def bubble_sort(ls):"""用i循环,逐步比较相邻元素,直到循环结束,停止交换&#xff0c;就像一个个气泡从下往上冒泡,每一次的循环结果都是最大的元素到了后面已排序序列的列首。"""j 0 # 用于确定循环次数,同时用于下…

策略模式(Strategy Pattern)+ 模板方法模式(Template Method Pattern)的组合使用

using Microsoft.Extensions.DependencyInjection;namespace ConsoleApp9 {internal class Program{static async Task Main(string[] args){Console.WriteLine("Hello, World!");// 创建并配置依赖注入容器var _serviceProvider new ServiceCollection().AddScoped…

es0102---语法格式、数据类型、整合springboot、创建库、创建映射、新增数据、自定义查询

ES 一、创建映射字段的语法格式 需要先构建索引库&#xff0c;在构建索引库中的映射关系 PUT /索引库名/_mapping {"properties": {"字段名": {"type": "类型","index": true&#xff0c;"store": false&#…

spring boot h2数据库无法链接问题

spring boot h2数据库无法链接问题datasource:# 数据库连接地址&#xff1a;H2在2.x后&#xff0c;不再支持创建数据库&#xff0c;需要手工创建&#xff0c;如&#xff1a;touch test.mv.db&#xff0c;# 否则会报“Database file not found”错误url: jdbc:h2:file:~/testdri…