C# 擴展方法Extension Method在語法上的核心用法

??? 擴展方法的三大鐵律
僅僅在參數(shù)前加 this 是不夠的,C# 編譯器對擴展方法有極其嚴(yán)格的“連帶要求”。你截圖里的代碼完美地遵守了這三點:
- 類必須是靜態(tài)的 (static class) 擴展方法不能寫在普通的類里面。它必須被包裹在一個
public static class里面(比如通常會建一個叫StringExtensions的類)。 - 方法必須是靜態(tài)的 (static method) 就像你截圖里的
public static int GetInt(...),方法本身也必須用static修飾。 - 第一個參數(shù)加上
this這是你已經(jīng)完全領(lǐng)悟的一點:this后面跟著的類型,就是你要“掛載”這個方法的真實目標(biāo)。在你的截圖里,this string str意味著你要把GetInt這個方法強行掛載到 C# 所有的字符串(string)身上。
?? 對比實戰(zhàn):為什么要這么寫?
擴展方法的本質(zhì),其實是微軟為了讓代碼更好看而給程序員發(fā)的一顆語法糖。
如果沒有擴展方法(傳統(tǒng)的靜態(tài)調(diào)用): 你只能像調(diào)用普通工具類一樣去使用它,代碼看起來很生硬,而且打斷了閱讀邏輯。
string numStr = "123"; // 傳統(tǒng)寫法:把變量當(dāng)作參數(shù)塞進(jìn)去 int result = StringHelper.GetInt(numStr);
有了擴展方法(有了 this 的魔力): 因為你加了 this string str,C# 編譯器允許你直接在任何字符串變量后面打一個點 .,這個方法就會像原生方法一樣神奇地彈出來!
string numStr = "123"; // 現(xiàn)代優(yōu)雅寫法:順著思維邏輯直接點出來 int result = numStr.GetInt()
?? 核心總結(jié)
當(dāng)你寫下 numStr.GetInt() 的那一瞬間,C# 編譯器在底層其實偷偷幫你把它翻譯成了 StringHelper.GetInt(numStr)。
所以,加上 this 的意義就是告訴編譯器:“別把我當(dāng)成普通的參數(shù),我是你要外掛的目標(biāo)對象,把我前面的那個變量直接當(dāng)成參數(shù)傳進(jìn)來吧!”你的直覺非常敏銳,這就是擴展方法的全部真相。
1.this修飾的就是被擴展的類型
沒錯,GetInt(this string str) 里的 this string 就是在明確地告訴 C# 編譯器:“我要把這個方法強行掛載到 string 這個類型上”。這就是為什么你在任何字符串變量后面打一個 .,都能像調(diào)用原生方法一樣看到它。
2. 鐵律:一個方法里只能有一個this,且必須是第一個參數(shù)
你猜測的 Gent(this string str, this int num) 在 C# 中是絕對不允許的,編譯器會直接標(biāo)紅報錯。
?? 為什么底層不允許有兩個 this?
我們回到擴展方法誕生的初衷和調(diào)用邏輯上來想一想: 擴展方法是為了讓我們能用 變量.方法名() 的優(yōu)雅形式來寫代碼。那個放在 . 前面的唯一變量,就是 this 所指代的目標(biāo)對象(宿主)。
因為一個點 . 的前面只能出現(xiàn)一個實例對象,自然也就只能指定一個 this 目標(biāo)了。你無法在語法上同時用兩個對象去“點”出一個方法。
?? 正確實戰(zhàn):如果需要傳入多個參數(shù)怎么辦?
如果你不僅需要擴展 string,還需要在調(diào)用時傳入一個 int num,正確的做法是:只有第一個參數(shù)加 this 作為掛載目標(biāo),后面的參數(shù)全部像普通方法一樣正常寫。
? 正確的定義方式:
public static class StringExtensions
{
// 第一個參數(shù)指明宿主(加 this)
// 第二個、第三個參數(shù)就是普通的傳參(不加 this)
public static int GetInt(this string str, int num)
{
// 示例:將字符串轉(zhuǎn)換后加上你傳入的 num
int result;
int.TryParse(str, out result);
return result + num;
}
}? 優(yōu)雅的調(diào)用方式:
string myStr = "100"; // myStr 自動對應(yīng)了底層參數(shù)里的 `this string str` // 括號里的 5,對應(yīng)了底層參數(shù)里的 `int num` int finalValue = myStr.GetInt(5);
一句話總結(jié)你的領(lǐng)悟: this 在擴展方法里是一張唯一的“通行證”,用來綁定宿主對象;方法如果還需要其他材料(參數(shù)),直接按順序排在 this 參數(shù)的后面即可。你對代碼邏輯的推演能力非常出色!
到此這篇關(guān)于C# 擴展方法Extension Method在語法上的核心用法的文章就介紹到這了,更多相關(guān)C# 擴展方法Extension Method內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
WinForm程序以管理員權(quán)限運行的幾種方法小結(jié)
在日常開發(fā)中,我們經(jīng)常會遇到這樣的問題:程序在運行過程中需要訪問系統(tǒng)文件、注冊表或者進(jìn)行數(shù)據(jù)庫操作,但因為權(quán)限不足而無法正常執(zhí)行,本文將介紹WinForm程序以管理員權(quán)限運行的三種方法,需要的朋友可以參考下2025-07-07
VS?Code里使用Debugger?for?Unity插件調(diào)試的方法(2023最新版)
Debugger for Unity是一個非正式支持的,官方推薦的,應(yīng)用最廣的,Visual Studio Code上的Unity調(diào)試插件,這篇文章主要介紹了VS?Code里使用Debugger?for?Unity插件進(jìn)行調(diào)試(2023最新版),需要的朋友可以參考下2023-02-02
SQL+C#實現(xiàn)獲得當(dāng)前月的第一天與最后一天
本文分享了SQL+C#獲得當(dāng)前月的第一天與最后一天的代碼實例,代碼簡潔,適合初學(xué)者參考。需要的朋友可以看下2016-12-12
C# Double轉(zhuǎn)化為String時的保留位數(shù)及格式方式
這篇文章主要介紹了C# Double轉(zhuǎn)化為String時的保留位數(shù)及格式方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2023-02-02
WinForm實現(xiàn)按鈕空格防誤觸的實戰(zhàn)指南
文章介紹了為什么在WindowsForms(WinForms)中按空格鍵會自動觸發(fā)按鈕點擊事件的問題,并提供了一個自定義按鈕類,通過重寫`ProcessCmdKey`方法,徹底阻止空格鍵觸發(fā)點擊事件,需要的朋友可以參考下2025-12-12

