1.問題提出
有時候,我希望能夠呼叫乙個方法判斷乙個string型別是否是合法的郵箱位址字串。一般的可以採取以下方法:
定義乙個專門的靜態工具類,名為stringformatchecker,並在其中定義乙個方法,名為checkmailaddrformat,用於測試該字串是否是合法的郵箱位址格式。
public static stringformatchecker
//用於測試該字串是否是合法的郵箱位址格式
public staic bool checkmailaddrformat(string str);
呼叫時:
string str = "leon.hong";
bool isvalid = stringformatchecker.checkmailaddrformat(str );
//isvalid返回false
但是這裡有兩個問題:
(1) 對於方法的使用者來說,他除了學習string類外,還增加了了解stringformatchecker類的學習成本
(2) 這個方法不是乙個具有良好內聚性的方法,因為被檢查的資源**於string,但是卻在另乙個類中完成這個過程。
2.利用.net的擴充套件方法(extension method)來解決這個問題
首先給出**
public static stringformatchecker
//用於測試該字串是否是合法的郵箱位址格式
public staic bool checkmailaddrformat(this string str);
從**看,不同之處,僅是對形參加了乙個this進行修飾,但是,在呼叫時,卻可以通過如下形式:
string str = "leon.hong";
bool isvalid = str.checkmailaddrformat(str);
//isvalid返回false
這個其他靜態類的方法貌似變成了乙個string的例項方法!!!
cool&shocking!!!
3.原理簡要分析
(1)在.net編譯器中,它首先檢查string是否提供了乙個checkmailaddrformat(string),如果存在這樣的乙個例項方法,那麼編譯器就會生成il來呼叫它。
(2)如果沒有,則繼續檢查是否任何乙個靜態類定義了乙個名為checkmailaddrformat(string)的靜態方法,它的第乙個引數是和當前用於呼叫方法的那個表示式的型別匹配的乙個型別,而且這個型別必須用this關鍵字標識。同時,它再生成相應的il**來呼叫。
C 基礎 擴充套件方法的應用
最近對擴充套件方法比較感興趣,就看了看資料,記錄一下擴充套件方法的幾種方法.一.擴充套件方法的基本使用 note 1.擴充套件方法必須在靜態類中,2 擴充套件方法必須宣告靜態方法,3 擴充套件方法裡面不能呼叫其他自定義方法。public static int trytoint this string...
C 中擴充套件方法應用
擴充套件方法是c 3.0 中新增特性,可在不修改源類 情況,通過add file 模式對源 功能擴充套件。擴充套件方法要求如下 a.擴充套件方法需包含在 static 修飾類中.b.擴充套件實現需是靜態形式。c.擴充套件方法第乙個引數 字首為 this 表示需要擴充套件類物件,從第二個引數開始,為擴...
c 高階應用 理解擴充套件方法
1 它必須在乙個非巢狀的,非泛型的靜態類中 2 它至少有乙個引數 3 第乙個引數必須加上this關鍵字作為字首 4 第乙個引數不能有任何其他的修飾符 比如out或ref 5 第乙個引數的型別不能是指標型別 for example public class person 擴充套件方法的建立 publi...