C#核心學習(七)面向對象--封裝(6)C#中的拓展方法與運算符重載: 讓代碼更“聰明”的魔法

目錄

一、什么是拓展方法?

二、拓展方法有啥用?怎么寫拓展方法?

1. ?核心用途

2. ?編寫步驟

實現步驟

關鍵點說明

關鍵規則

3. ?注意事項

三、什么是運算符重載?

四、運算符重載有啥用?怎么寫?

1. ?核心用途

2. ?編寫步驟

3. ?可重載的運算符

4. ?注意事項

五、總結

?對比表:拓展方法 vs 運算符重載


前言:當代碼學會“七十二變”?

????????有沒有想過,讓?string?類型突然學會統計單詞數?或者讓你的自定義類像?int?一樣支持加減乘除?

????????C#的拓展方法就像“魔法外掛”,能讓任何類型瞬間解鎖新技能,而運算符重載則是“對象變身術”,讓你的類搖身一變成為數學高手!

本文將揭秘這兩個神器的使用秘籍,讓你告別冗長代碼,擁抱優雅語法——從此,你的代碼不僅能“說話”,還能“算卦”!

一、什么是拓展方法?

????????拓展方法(Extension Methods)?是C#中一種特殊的語法,允許為現有類型(包括密封類或系統類型)添加新方法,而無需修改原始代碼或創建子類。

概念
為現有的 非靜態變量 添加 新方法
作用
1.提高程序拓展性
2.不需要在對象中重新寫方法
3.不需要繼承來添加方法
4.為別人封裝的類型寫額外的方法
特點
1.一定是寫在靜態類中
2.一定是個靜態函數
3.第一個參數為拓展目標
4.第一個參數用this修飾

  • ?核心特點
    • 定義在靜態類中,方法為靜態方法。
    • 第一個參數用?this?關鍵字修飾,表示要擴展的類型。
    • ?擴展方法的本質是一個靜態方法,但在調用時,編譯器會自動將實例對象(即調用者)?作為第一個參數傳遞進去。這種語法糖讓擴展方法看起來像是實例方法,但實際上背后是靜態方法的調用邏輯。

基本語法:訪問修飾符 static 返回值 函數名(this 拓展類名 參數名,參數類型 參數名,)

  • ?示例:為?string?類型添加一個統計單詞數的方法。
public static class StringExtensions {public static int WordCount(this string str) {return str.Split(new[] {' ', '.', '?'}, StringSplitOptions.RemoveEmptyEntries).Length;}
}// 使用
string text = "Hello, how are you?";
Console.WriteLine(text.WordCount()); // 輸出 4

二、拓展方法有啥用?怎么寫拓展方法?

1. ?核心用途

  • ?擴展現有類型功能:尤其適用于無法修改源碼的類(如系統類型或第三方庫)。
  • ?鏈式調用:讓代碼更流暢(如LINQ基于拓展方法實現)。
var numbers = new List<int> { 1, 2, 3 };
var sum = numbers.Where(n => n > 1).Sum(); // LINQ的Where和Sum均為拓展方法

2. ?編寫步驟

  1. ?創建靜態類:類名建議以?Extensions?結尾(如?StringExtensions)。
  2. ?定義靜態方法:第一個參數用?this?修飾,表示目標類型。

基本語法:訪問修飾符 static 返回值 函數名(this 拓展類名 參數名,參數類型 參數名,)

    public static class MathExtensions {public static double Square(this int num) => num * num;
    }
    // 使用
    int num = 5;
    Console.WriteLine(num.Square()); // 25

    ????????除了為系統內部的類型進行拓展方法,我們自己還可以為自己寫的靜態類進行拓展方法:??????假設有一個?Product?類,表示商品信息:

    實現步驟
    1. ?定義靜態類:創建名為?ProductExtensions?的靜態類。
    2. ?編寫擴展方法:添加一個靜態方法,第一個參數用?this Product product?修飾。
    3. ?實現邏輯:在方法內部訪問?Product?的公開屬性。
    public class Product {public string Name { get; set; }public decimal Price { get; set; }public int Stock { get; set; }
    }

    ????????我們希望為?Product?添加一個擴展方法,用于生成商品描述的格式化字符串,而無需修改?Product?類的原始代碼。就可以如下書寫:

    public static class ProductExtensions {// 擴展方法:生成商品描述public static string GetDescription(this Product product) {return $"{product.Name} - 價格:¥{product.Price},庫存:{product.Stock}件";}// 擴展方法:檢查庫存是否充足public static bool IsInStock(this Product product, int requiredQuantity) {return product.Stock >= requiredQuantity;}
    }

    測試:

    // 創建商品實例
    var product = new Product {Name = "無線藍牙耳機",Price = 299.99m,Stock = 50
    };// 調用擴展方法
    string description = product.GetDescription();
    bool isAvailable = product.IsInStock(30);Console.WriteLine(description); 
    // 輸出:無線藍牙耳機 - 價格:¥299.99,庫存:50件
    Console.WriteLine(isAvailable ? "庫存充足" : "庫存不足"); 
    // 輸出:庫存充足

    關鍵點說明

    1. ?靜態類與靜態方法:

      • 所有擴展方法必須定義在?static class?中。
      • 方法本身必須是?static?的,且第一個參數用?this?關鍵字標記目標類型。
    2. ?訪問權限:

      • 擴展方法只能訪問目標類型的 ?**public?成員**?(如?Product?的?NamePrice)。
      • 無法訪問?private?或?protected?成員。
    3. ?命名空間依賴:

      • 若擴展方法定義在命名空間?MyExtensions?中,使用時需通過?using MyExtensions;?引入。?

    關鍵規則

    1. ?隱式傳遞實例

      • 調用擴展方法時,實例對象(如?product)會自動成為靜態方法的第一個參數。
      • 你無需(也不能)手動傳遞該參數。
    2. ?附加參數

      • 擴展方法定義中除第一個參數(this參數)外的其他參數,需在調用時顯式傳入。
      • 例如?IsInStock(30)?中的?30?對應方法定義中的?requiredQuantity

    補充示例:為系統自帶類int拓展的方法:

    public static class IntExtensions {// 判斷數字是否為偶數public static bool IsEven(this int number) {return number % 2 == 0;}// 計算數字的平方public static int Square(this int number) {return number * number;}
    }// 使用
    int num = 5;
    Console.WriteLine(num.IsEven()); // 輸出 False
    Console.WriteLine(num.Square()); // 輸出 25

    3. ?注意事項

    • 拓展方法優先級低于類的實例方法。????????
    • 無法訪問類型的私有成員。
    • 需通過命名空間引入拓展方法所在的類。

    三、什么是運算符重載?

    ????????運算符重載(Operator Overloading)?允許為自定義類型重新定義運算符的行為?(如?+,?==,?>?等)。

    概念
    讓自定義的類和結構體
    能夠運用運算符?

    使用關鍵字
    operator

    特點
    1.一定是一個公共的靜態方法
    2.返回值寫在operator前
    3.邏輯處理自定義

    作用
    讓自定義類和結構體對象可以進行運算
    注意
    1.條件運算符需要成對出現
    2.一個符號可以多次重載
    3.不能使用ref out?

    • ?核心規則
      • 使用?operator?關鍵字定義。
      • 必須是?public static?方法。
    • ?示例:為自定義的?Vector?類重載?+?運算符。
    • 語法:public static 返回類型 operator 運算符(參數列表)
    public class Vector {public int X { get; }public int Y { get; }public Vector(int x, int y) { X = x; Y = y; }public static Vector operator +(Vector a, Vector b) {return new Vector(a.X + b.X, a.Y + b.Y);}
    }// 使用
    Vector v1 = new Vector(1, 2);
    Vector v2 = new Vector(3, 4);
    Vector sum = v1 + v2; // sum.X=4, sum.Y=6

    四、運算符重載有啥用?怎么寫?

    1. ?核心用途

    • ?自然語義:讓自定義類型支持直觀的運算符操作(如復數相加、矩陣乘法)。
    • ?提高可讀性:用?a + b?替代?a.Add(b)

    2. ?編寫步驟

    1. ?定義運算符方法:指定運算符和操作數類型。
    2. ?實現運算邏輯:返回計算結果

    語法:public static 返回類型 operator 運算符(參數列表)

    如下是一個用來計算溫度的? “? + ”:

    public class Temperature {public double Celsius { get; }public Temperature(double celsius) { Celsius = celsius; }public static Temperature operator +(Temperature t1, Temperature t2) {return new Temperature(t1.Celsius + t2.Celsius);}
    }

    3. ?可重載的運算符

    ?運算符類型?示例
    算術運算符+,?-,?*,?/,?%
    比較運算符==,?!=,?>,?<,?>=,?<=
    轉換運算符implicit?或?explicit

    4. ?注意事項

    • 必須成對重載(如重載?==?必須同時重載?!=)。
    • 不能重載賦值運算符(如?=+=)。
    • 避免過度使用導致邏輯混亂(如讓?+?執行減法操作)。

    五、總結

    ?對比表:拓展方法 vs 運算符重載

    ?特性?拓展方法?運算符重載
    ?核心目的擴展現有類型的功能自定義類型支持運算符操作
    ?語法要求靜態類 +?this?參數public static operator
    ?適用場景工具方法、鏈式調用、LINQ數學運算、集合操作、語義化操作
    ?限制無法訪問私有成員需成對重載、不能重載所有運算符

    一句話記憶

    • 拓展方法:“別人家的孩子,我來教他新技能。”
    • 運算符重載:“我的對象,加減乘除我說了算!”

    掌握這兩個特性,讓你的C#代碼像自然語言一樣直觀!

    本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
    如若轉載,請注明出處:http://www.pswp.cn/news/899992.shtml
    繁體地址,請注明出處:http://hk.pswp.cn/news/899992.shtml
    英文地址,請注明出處:http://en.pswp.cn/news/899992.shtml

    如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

    相關文章

    銀行卡歸屬地查詢API接口如何對接?

    銀行卡歸屬地查詢 API 接口是一種能讓開發者通過編程方式獲取銀行卡歸屬地等相關信息的工具。借助此接口&#xff0c;開發者可將銀行卡歸屬地查詢功能集成到自己的應用程序或系統里&#xff0c;像電商平臺、第三方支付公司等都能運用它來提升業務的準確性與安全性。 銀行卡歸屬…

    ORM mybits mybits-plus

    ORM ORM 即對象關系映射&#xff08;Object Relational Mapping&#xff09;&#xff0c;是一種程序設計技術&#xff0c;用于實現面向對象編程語言里不同類型系統的數據之間的轉換。下面從基本概念、工作原理、優勢與劣勢、常見的 ORM 框架等方面詳細介紹 ORM。 常見的orm框架…

    網絡編程—網絡概念

    目錄 1 網絡分類 1.1 局域網 1.2 廣域網 2 常見網絡概念 2.1 交換機 2.2 路由器 2.3 集線器 2.4 IP地址 2.5 端口號 2.6 協議 3 網絡協議模型 3.1 OSI七層模型 3.2 TCP/IP五層模型 3.3 每層中常見的協議和作用 3.3.1 應用層 3.3.2 傳輸層 3.3.3 網絡層 3.3.4…

    4月3日工作日志

    一個樸實無華的目錄 今日學習內容&#xff1a;1.關系數據庫 今日學習內容&#xff1a; 1.關系數據庫

    git commit Message 插件解釋說明

    - feat - 一項新功能 - fix - 一個錯誤修復 - docs - 僅文檔更改 - style - 不影響代碼含義的更改&#xff08;空白、格式化、缺少分號等&#xff09; - refactor - 既不修復錯誤也不添加功能的代碼更改 - perf - 提高性能的代碼更改 - build - 影響構建系統或外部依賴項…

    ngx_open_file

    定義在 src\os\unix\ngx_files.h #define ngx_open_file(name, mode, create, access) \open((const char *) name, mode|create, access) name&#xff1a;文件名&#xff08;通常是一個字符串&#xff09;。mode&#xff1a;文件打開模式&#x…

    23種設計模式-行為型模式-責任鏈

    文章目錄 簡介問題解決代碼核心改進點&#xff1a; 總結 簡介 責任鏈是一種行為設計模式&#xff0c;允許你把請求沿著處理者鏈進行發送。收到請求后&#xff0c;每個處理者均可對請求進行處理&#xff0c;或將其傳遞給鏈上的下個處理者。 問題 假如你正在開發一個訂單系統。…

    注意力機制在大語言模型中的原理與實現總結

    注意力機制在大語言模型中的原理與實現總結 1. 章節介紹 在大語言模型的學習中&#xff0c;理解注意力機制至關重要。本章節旨在深入剖析注意力機制的原理及其在大語言模型中的應用&#xff0c;為構建和優化大語言模型提供理論與實踐基礎。通過回顧神經網絡基礎及傳統架構的局…

    kafka消息可靠性傳輸語義

    Kafka提供了多種消息傳遞語義&#xff0c;以適應不同的業務需求和可靠性要求。以下是Kafka消息傳輸的可靠性語義及其實現機制&#xff1a; 1. At Most Once&#xff08;至多一次&#xff09; 語義&#xff1a;消息可能會丟失&#xff0c;但不會被重復傳遞。 實現機制&#xf…

    NLP高頻面試題(三十三)——Vision Transformer(ViT)模型架構介紹

    Transformer架構在自然語言處理領域取得了顯著成功&#xff0c;激發了研究人員將其應用于計算機視覺任務的興趣。Vision Transformer&#xff08;ViT&#xff09;應運而生&#xff0c;成為圖像分類等視覺任務中的新興架構。本文將介紹ViT的基本架構、工作原理&#xff0c;并與傳…

    Oracle數據庫數據編程SQL<3.6 PL/SQL 包(Package)>

    包是Oracle數據庫中一種重要的PL/SQL程序結構,它將邏輯相關的變量、常量、游標、異常、過程和函數組織在一起,提供了更好的封裝性和模塊化。在大型項目中,可能有很多模塊,而每一個模塊又有自己的存過、函數等。而這些存過、函數默認是放在一起的,如果所有的存過函數都是放…

    機器學習 分類算法

    【實驗名稱】 實驗&#xff1a;分類算法 【實驗目的】 1.了解分類算法理論基礎 2.平臺實現算法 3. 編程實現分類算法 【實驗原理】 分類(Categorization or Classification)就是按照某種標準給對象貼標簽(label),再根據標簽來區分歸類。 【實驗環境】 OS&#xff1a;Ubuntu16.0…

    HTML5 Canvas繪畫板項目實戰:打造一個功能豐富的在線畫板

    HTML5 Canvas繪畫板項目實戰&#xff1a;打造一個功能豐富的在線畫板 這里寫目錄標題 HTML5 Canvas繪畫板項目實戰&#xff1a;打造一個功能豐富的在線畫板項目介紹技術棧核心功能實現1. 畫板初始化與工具管理2. 多樣化繪畫工具3. 事件處理機制 技術要點分析1. Canvas上下文優化…

    【YOLOv8】YOLOv8改進系列(12)----替換主干網絡之StarNet

    主頁&#xff1a;HABUO&#x1f341;主頁&#xff1a;HABUO &#x1f341;YOLOv8入門改進專欄&#x1f341; &#x1f341;如果再也不能見到你&#xff0c;祝你早安&#xff0c;午安&#xff0c;晚安&#x1f341; 【YOLOv8改進系列】&#xff1a; YOLOv8結構解讀 YOLOv8…

    1Panel 面板 寶塔面板 Ubuntu 24.04

    1Panel 面板 寶塔面板 Ubuntu 24.04 https://1panel.cn/ 1Panel 是一款開源的 Linux 服務器運維管理面板&#xff0c;它就像是給服務器配上了一個智能管家&#xff0c;讓我們能通過 Web 端輕松管理服務器。以往我們管理 Linux 服務器&#xff0c;常常需要在命令行中輸入各種復…

    Node.js全局生效的中間件

    目錄 1. 目錄結構 2. 代碼實現 2.1 安裝Express 2.2 app.js - 主文件 2.3 globalMiddleware.js - 全局中間件 3. 程序運行結果 4. 總結 在Node.js的Express框架中&#xff0c;全局生效的中間件是指應用程序啟動后&#xff0c;對所有請求都有效的中間件。它通常用于日志記…

    WiFi(無線局域網)技術的多種工作模式

    WiFi&#xff08;無線局域網&#xff09;技術支持多種工作模式&#xff0c;以滿足不同的網絡需求和應用場景。以下是主要的WiFi工作模式及其詳細說明&#xff1a; 1. 基礎設施模式&#xff08;Infrastructure Mode&#xff09; [無線接入點 (AP)]/ | \ [客戶端…

    PHP 8.x:現代Web開發的性能與效率革命

    隨著PHP 8.x系列的持續演進&#xff0c;這門誕生于1995年的“古老”語言正煥發新生。通過引入革命性的JIT編譯器、類型系統增強及一系列現代化語法特性&#xff0c;PHP 8.x不僅鞏固了其在Web開發領域的統治地位&#xff0c;更將性能與開發者體驗推向新高度。 一、JIT編譯器&am…

    【扣子agent入門】搭建計算熱量工作流

    一、食物熱量知識庫 1. 創建知識庫 工作空間——資源庫——創建資源>知識庫 2. 自動采集網頁數據 文本格式>在線數據 自動采集 找一個食物熱量網站進行采集。 一定要讓知識按條數分段&#xff0c;不然不好查詢。 二、 意圖識別節點 意圖識別&#xff08;In…

    腦影像分析軟件推薦 | JuSpace

    目錄 1. 軟件界面 2.工具包功能簡介 3.軟件安裝注意事項 參考文獻&#xff1a; Dukart J, Holiga S, Rullmann M, Lanzenberger R, Hawkins PCT, Mehta MA, Hesse S, Barthel H, Sabri O, Jech R, Eickhoff SB. JuSpace: A tool for spatial correlation analyses of magne…