標籤:一個 src font ring 簡單 調用 思想 類庫 尋找
擴充方法
在很多時候我們需要編寫各種各樣的協助類,因為官方提供的再全面,也會有未包含到的地方,這時一個靜態協助類就可以幫我們解決問題
舉一個不是很恰當的例子,假如要對一個字串進行驗證其內容不為null並且等於admin但是很多地方都要調用,按照封裝思想要封裝成一個方法,看起來可能是下面這樣子的
這並沒有任何問題,代碼也是比較簡單,但是很難會有一種親近感,因為StringiHelper.ValidArg這樣的調用存在。比如這個驗證應該是官方應該考慮到的,但是他們忽略了,編寫這樣一個擴充後會有很深的侵入感。
使用擴充方法,可以讓方法假裝是字串類型的自帶方法。像下面這樣
與之前相比 ,我們更改了什麼呢?在ValidArg方法的參數裡加了一個this關鍵詞,調用的時候直接str.ValidArg就可以了,這看起來很酷,也很神奇,看起來就像是string提供的原生方法一樣!但事實是這樣麼,並不是,編譯器告訴了我們,它是擴充方法
編譯器怎麼會知道呢?調用的背後又做了什麼呢? 其實沒有想象的那麼複雜,編譯器尋找時會優先尋找執行個體方法也就是當前執行個體類型所在的命名空間進行掃描,如果沒有執行個體方法那麼就會去尋找當前using的命名空間下和當前空間下所有的擴充方法,如果知道是擴充方法呢?請看
反編譯後看到了有一個System.Runtime.CompilerServices.ExtensionAttribute的特性,也就是編譯器會掃描所有加了ExtensionAttribute特性的方法當做擴充方法
而調用呢,最後還是使用了StringHelper.ValidArg這樣的調用方式,
下面需要說一下擴充方法的使用和其限制,聲明擴充方法需要遵守以下規則
- 它必須在一個非嵌套、非泛型的靜態類中
- 方法至少有一個參數
- 第一個參數必須使用this關鍵詞做為首碼
- 第一個參數不可以有任何其他的修改符
- 第一個參數的類型不可以是指標類型
有了擴充方法,我們可以對使用的第三方類庫進行擴充,使其更加的強大!而且使用起來非常自然。管理擴充方法是一個經驗之談,最有效就是使用命名空間進行管理。比如枚舉,命名空間可以使用EnumExtension。
C#3.0 擴充方法