【C#学习Day15笔记】拆箱装箱、 Equals与== 、文件读取IO

前言

在C#第15天的学习中,我深入探索了类型转换机制对象比较原理文件操作技术三大核心主题。这些知识是构建高效、健壮程序的关键基础。本文完整保留我的课堂实践代码和命名体系,通过结构化梳理帮助大家掌握这些核心概念。所有代码示例均来自我的实际操作,包含从基础到进阶的完整学习过程!


一、拆箱装箱:值类型与引用类型的转换

1. 基础概念与实现

// 装箱:值类型 → 引用类型
int a = 1;
object b = a;  // 装箱操作// 拆箱:引用类型 → 值类型
object c = 1;
int d = (int)c; // 拆箱操作

2. 内存机制解析


3. 性能影响与最佳实践

操作性能开销使用建议
装箱高(内存分配+数据复制)避免在循环中使用
拆箱中(类型检查+数据复制)确保类型兼容
泛型集合无(避免装箱拆箱)优先使用List

二、Equals与==:对象比较的深层解析

1. 值类型比较

int x = 10;
int y = 10;// == 运算符比较
Console.WriteLine(x == y); // true// Equals方法比较
Console.WriteLine(x.Equals(y)); // true

2. 引用类型比较

class Person
{public int Age { get; set; }public string Name { get; set; }public Person(int age, string name){Age = age;Name = name;}
}Person p1 = new Person(18, "张三");
Person p2 = new Person(18, "张三");// == 默认比较引用地址
Console.WriteLine(p1 == p2); // false// Equals默认比较引用地址
Console.WriteLine(p1.Equals(p2)); // false

3. 重写Equals实现值比较

class Person
{// ...其他代码同上...// 重写Equals方法public override bool Equals(object obj){// 类型检查if (obj == null || GetType() != obj.GetType())return false;Person p = (Person)obj;return Age == p.Age && Name == p.Name;}// 重写GetHashCode(推荐与Equals一起重写)public override int GetHashCode(){return Age.GetHashCode() ^ Name.GetHashCode();}
}// 使用重写后的Equals
Console.WriteLine(p1.Equals(p2)); // true

4. 比较操作决策表

比较场景推荐方式注意事项
值类型相等== 或 Equals两者行为相同
引用类型地址相等==默认行为
引用类型值相等重写 Equals需同时重写 GetHashCode
字符串内容相等== 或 Equals字符串已特殊处理

三、文件IO操作:数据持久化技术

1. FileStream基础操作

// 创建文件信息对象
FileInfo fi = new FileInfo("data.txt");// 写入文件
using (FileStream writeStream = fi.OpenWrite())
{byte[] data = { 65, 66, 67, 68, 69 };writeStream.Write(data, 0, data.Length);
}// 读取文件
using (FileStream readStream = fi.OpenRead())
{byte[] buffer = new byte[fi.Length];int bytesRead = readStream.Read(buffer, 0, buffer.Length);foreach (byte b in buffer){Console.WriteLine(b);}
}

2. StreamReader/Writer高级操作

// 获取动态路径
string path = Path.Combine(Directory.GetCurrentDirectory(), "data.txt");// 写入数据
using (StreamWriter sw = new StreamWriter(path, true)) // true表示追加模式
{sw.WriteLine("张三今天打游戏了");sw.WriteLine("李四今天游泳了");sw.WriteLine("王五今天吃饭了");
}// 读取数据
using (StreamReader sr = new StreamReader(path))
{string content = sr.ReadToEnd();string[] lines = content.Split('\n');foreach (string line in lines){if (line.Contains("张三")){Console.WriteLine("找到张三的记录");}}
}

3. 文件操作最佳实践

  1. 路径处理​:

    • 使用Path.Combine()构建路径
    • 使用Directory.GetCurrentDirectory()获取当前目录
    • 避免硬编码绝对路径
  2. 资源管理​:

    • 始终使用using语句确保资源释放
    • 处理文件不存在异常
    • 检查磁盘空间
  3. 性能优化​:

    • 使用缓冲区减少IO操作
    • 异步读写大文件
    • 批量处理小文件

四、综合案例:学生成绩管理系统

1. 学生类实现

class Student
{public string Name { get; set; }public int Score { get; set; }public Student(string name, int score){Name = name;Score = score;}// 重写Equals实现值比较public override bool Equals(object obj){if (obj is Student other)return Name == other.Name && Score == other.Score;return false;}public override int GetHashCode(){return Name.GetHashCode() ^ Score;}
}

2. 文件存储与加载

class ScoreManager
{private List<Student> students = new List<Student>();private string filePath;public ScoreManager(string path){filePath = path;LoadData();}// 加载数据private void LoadData(){if (File.Exists(filePath)){using (StreamReader sr = new StreamReader(filePath)){string line;while ((line = sr.ReadLine()) != null){string[] parts = line.Split(',');if (parts.Length == 2 && int.TryParse(parts[1], out int score)){students.Add(new Student(parts[0], score));}}}}}// 保存数据public void SaveData(){using (StreamWriter sw = new StreamWriter(filePath)){foreach (Student s in students){sw.WriteLine($"{s.Name},{s.Score}");}}}// 添加学生public void AddStudent(Student student){students.Add(student);}// 查找学生public Student FindStudent(string name){return students.Find(s => s.Name == name);}
}

3. 系统使用示例

// 初始化管理器
ScoreManager manager = new ScoreManager("scores.txt");// 添加学生
manager.AddStudent(new Student("张三", 90));
manager.AddStudent(new Student("李四", 85));// 保存数据
manager.SaveData();// 查找学生
Student found = manager.FindStudent("张三");
if (found != null)
{Console.WriteLine($"找到学生: {found.Name}, 成绩: {found.Score}");
}// 比较学生
Student s1 = new Student("王五", 80);
Student s2 = new Student("王五", 80);
Console.WriteLine(s1.Equals(s2)); // true

学习总结与进阶建议

核心知识图谱


关键编程原则

  1. 类型转换​:

    • 避免不必要的装箱拆箱
    • 使用泛型集合替代非泛型集合
    • 优先使用asis进行安全转换
  2. 对象比较​:

    • 值类型直接使用==
    • 引用类型按需重写Equals
    • 重写Equals时同步重写GetHashCode
  3. 文件操作​:

    • 使用using确保资源释放
    • 处理所有可能的IO异常
    • 使用相对路径增强可移植性

实战项目建议

  1. 类型系统应用​:

    • 实现高性能数值计算库
    • 开发类型安全的数据容器
    • 创建泛型缓存系统
  2. 对象比较实践​:

    • 实现深度比较工具
    • 开发自定义集合类
    • 创建对象差异检测器
  3. 文件IO实战​:

    • 开发配置管理系统
    • 实现数据导入导出功能
    • 创建日志记录模块

编程箴言
"理解类型转换是性能优化的基础,掌握对象比较是正确性的保障,善用文件IO是数据持久化的关键"

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

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

相关文章

发电类电力业务许可证申请条件

基本条件&#xff1a;法人资格&#xff1a;申请人必须是依法注册的企业法人。 财务能力&#xff1a;应具有与所申请从事的电力业务相适应的财务能力。 专业人员要求&#xff1a;生产运行负责人、技术负责人、安全负责人和财务负责人需具备至少3年以上与申请从事的电力业务相关的…

JavaScript 高效入门指南:从基础到实战(VSCode 版)

废话不多说&#xff0c;直接上干货&#x1f600; 一、先搞定工具&#xff1a;VSCode 配置成「JS 开发神器」 工欲善其事&#xff0c;必先利其器。用 VSCode 写 JavaScript&#xff0c;这几个配置能让你效率翻倍&#xff1a; 1. 必装插件&#xff08;直接在 VSCode 插件商店搜…

《人形机器人的觉醒:技术革命与碳基未来》——类人关节设计:柔性驱动革命之液压人工肌肉

目录&#xff1a;一、人工肌肉的种类及人形机器人适用情况二、人形机器人用人工肌肉科研机构及其最新成果进展三、液压人工肌肉种类及工作机制四、液压人工肌肉适用人形机器人的性能要求和局限性五、液压人工肌肉材料技术进展及其限制与突破六、波士顿动力Spot的液压静液传动系…

26数据结构-顺序表

&#x1f4cc;有序顺序表的合并 #define MAX_SIZE 20 struct SeqList {int data[MAX_SIZE];int length; }; void mergeArray(SeqList &L1,SeqList &L2,SeqList &L) {int i0,j 0;while(i<L1.length && j<L2.length){if(L1.data[i]<L2.data[j])L.da…

25电赛e题 控制激光开关电路

e题明确说了禁止使用继电器控制&#xff0c;所以需要自己搭建一个mos管控制电路这里使用mos管来驱动GPIO → 电阻(220Ω) → MOSFET栅极(如IRF520N)MOSFET漏极接激光器正极MOSFET源极接地激光器负极直接接电源连接方式如下这里r36为栅极电阻&#xff0c;需要跟你们使用的mos配合…

ubuntu apt源报错?

报错原因&#xff1a;一、网络连接方面1.网络不通畅&#xff08;常见&#xff09;简单来说就是你的虚拟机连不上网&#xff0c;这时候你应该检查自己的ip 是不是dhcp自动获取的&#xff0c;或者你的网络配置是否有误。2.DNS 解析故障&#xff1a;DNS 服务器配置错误或 DNS 服务…

Scene as Occupancy

OccNet https://github.com/OpenDriveLab/OccNet Scene as Occupancy 提出了一种新的场景表示方法&#xff0c; 利用环视摄像头&#xff0c;采用级联和时序体素编码的方式来重建三维Occ场景。Method 1&#xff09;提出的OCCNet首先重建占据描述符&#xff0c;目标是为支持下游任…

Linux基础复习:字符输入与输出

该文仅针对自身对Linux基础知识不足的地方进行补充扩展&#xff0c;便于巩固。终端的输入和输出由字符设备管理。1、查看当前字符设备# 查看当前bash进程 [rootopenEuler-1 ~]# psPID TTY TIME CMD9662 pts/1 00:00:00 bash9938 pts/1 00:00:00 ps# 该目录存放了…

【初识数据结构】CS61B中的基数排序

本教程介绍 CS61B 中的基数排序&#xff0c;这是一种可以在某些情况下甚至超越归并排序、快速排序的特殊的排序方法&#xff0c;但是牺牲了内存空间计数排序 连续编号情形 我们需要对一个编号从 0 到 11 的表进行排序实际上我们可以拿出另一张同样大小的空白表&#xff0c;在遍…

ReAct模式深度解析:构建具备推理能力的AI智能体架构

本文深入剖析ReAct(Reasoning+Acting)架构设计模式,揭示如何通过推理与行动循环构建具备自主决策能力的AI智能体,并展示其在复杂问题求解中的革命性突破。 引言:从工具调用到自主决策的进化 传统AI系统面临的核心瓶颈: #mermaid-svg-orlnKyviyW86xIJZ {font-family:&quo…

Corrosion2靶机攻略

第一步搭建环境 靶机下载地址&#xff1a;https://download.vulnhub.com/corrosion/Corrosion2.ova 下载完成后直接右击用VM打开&#xff0c;重试一下就可以了 右击虚拟机设置将网络连接改成nat模式 第二步信息收集 查看一下靶机的网段&#xff0c;左上角编辑&#xff0c;虚…

SSL 剥离漏洞

一、SSL/TLS 协议基础​1.1、SSL/TLS 协议的核心功能​SSL/TLS 协议的核心功能主要包括三个方面&#xff1a;加密、认证和完整性校验&#xff0c;这三大功能共同构建了网络通信的安全屏障。​&#xff08;一&#xff09;加密​加密是 SSL/TLS 协议最基本的功能。它通过使用对称…

c++-reverse_iterator

C反向迭代器 反向迭代器是C标准库提供的一种适配器&#xff0c;它允许我们以相反的顺序遍历容器&#xff0c;反向迭代器是正向迭代器的封装。 迭代器可以分为两类&#xff1a;方向性质&#xff1a;单向迭代器&#xff08;Forward Iterator&#xff09;双向迭代器&#xff08;Bi…

linux内核驱动:电流/电压/功率监控模块INA226调试

目录背景一、芯片介绍二、手册三、内核驱动配置3.1 设备树配置3.2 修改内核配置文件3.3 编译四、内核驱动分析1、初始化流程2、属性文件/解释五、调试和计算背景 最近调试了一款德州仪器的带有I2C控制接口的可以实现电压、电流、功率监测&#xff0c;并可以进行报警设置的芯片I…

ACL 2024 大模型方向优秀论文:洞察NLP前沿​关键突破

关注gongzhonghao【计算机sci论文精选】近年来&#xff0c;以Transformer架构为核心的大语言模型重塑了自然语言处理领域的技术范式。当前ACL相关研究呈现多维度深化态势&#xff0c;从开源社区推动轻量化架构与低成本训练技术革新&#xff0c;到学术界探索检索增强等机制突破长…

乐创E20H1型IO从站与Ethercat转Profinet网关转换器的配置应用案例

本案例聚焦于西门子 1200PLC 与 E20H1 - T01 IO 从站的连接。在正常运行过程中&#xff0c;E20H1 - T01 IO 从站需支持 EtherCAT 协议&#xff0c;作为 EtherCAT 从站&#xff1b;而监控系统所采用的西门子 S7 - 1200 系列 PLC 则支持 PROFINET 协议。由于协议的不一致性&#…

【2】专业自定义图表创建及应用方法

一、专业自定义图表创建及应用方法1&#xff09;不是图表的图表制作方法例题1:迷你图表制作方法&#xfeff;定义&#xff1a;指依靠Excel基本制图功能之外的其他功能&#xff08;如公式、条件格式、迷你图等&#xff09;创建的数据可视化图表特点&#xff1a;引用数据少且占用…

embodied复现所需docker环境配置粗略流程

由于embodied很多安装包都需要linux环境&#xff0c;所以为了建立虚拟ubuntu系统&#xff0c;在不适用vmvare的情况&#xff0c;可以考虑使用docker容器来实现&#xff0c;也不会出现的vmware的卡顿情况 1.首先建立容器&#xff0c;并和pycharm建立连接,先安装docker desktop&a…

2025.8-12月 AI相关国内会议

以下是2025年8月至12月国内与人工智能&#xff08;AI&#xff09;相关的重要会议及活动总结&#xff0c;按时间顺序排列&#xff1a; 2025年8月第六届人工智能与机电自动化国际学术会议&#xff08;AIEA 2025&#xff09; • 时间&#xff1a;8月1-3日 • 地点&#xff1a;安徽…

计数组合学7.10(舒尔函数的组合定义)

7.10 舒尔函数的组合定义 前几节讨论的四个基 mλm_{\lambda}mλ​、eλe_{\lambda}eλ​、hλh_{\lambda}hλ​ 和 pλp_{\lambda}pλ​ 的定义都较为直观。本节将介绍第五个基&#xff0c;其元素记为 sλs_{\lambda}sλ​&#xff0c;称为舒尔函数&#xff0c;其定义则更为微…