【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
英文地址,請注明出處:http://en.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;其定義則更為微…