1. 程式人生 > >CLR類型設計之方法與構造器

CLR類型設計之方法與構造器

重寫 理想 額外 整潔 字符 聲明 -1 ima 就會

C#語言中最常用到的就是方法的語法,如果在控制臺應用程序中,一定要有一個Main()方法作為程序入口,本文討論的不是方法實現也不是為什麽要寫方法,而是來討論下如何構造器和擴展方法。

無論學習那門語言都要學習函數體,C#,JAVA,PHP,都會涉及到函數體,而C#的函數體成員並不少,方法和構造器就是函數體成員之一,函數體成員還包括但不限於:方法,屬性,構造器,終結器,運算符及索引器。

方法就是某個類相關的函數,也可以返回簡單的基元類型或者什麽也不反回,方法可以定義其公開性,如果使用static修飾符則變為靜態方法。

屬性是可以從客戶端訪問到的函數組,訪問形式和訪問類相同,C#為讀寫類中的屬性提供了專用語法。

構造器是實例化對象時自動調用的特殊函數,必須與所屬的類同名,且不能有返回類型,構造器用於初始化字段的值,可通過不同參數進行重載。

終結器類似與構造函數,但是CLR檢測到不再需要某個對象時調用他,他的名稱與類相同,但前面有一個~符號

運算符執行的最簡單操作就是“+’“-’“*’“/’這些基本運算,C#也支持重載運算符

索引器允許對象以數組的或集合的方式進行索引。

構造器

以上就是函數體的基本成員和方法的基本定義,接下來我們先說一下構造器,為什麽說構造器?

因為構造器實際上會幫我們很好的理解方法一個類的初始化過程,我們會發現無論是一個對象實體或是方法,大部分都會放在cs文件中,而構造器是初始化對象的,我建立了一個Student的類裏面只有一個字段一個函數體,在Main函數中我初始化了Student類,運行就會發現構造器函數以及執行,並且調用了方法write

技術分享運行後輸出的結果 技術分享

當然在我們平時寫代碼的時候沒有必要去可以初始化構造器,C#編輯器會自動為其初始化構造器,這個構造器會默認的把所有成員字段初始化為標準的默認值。我們可以為一個類提供任意多的構造函數,但其簽名不能相同。

構造函數中,還有一個特殊的存在, readonly

關鍵字是一個可在字段上使用的修飾符。 當字段聲明包括 readonly 修飾符時,該聲明引入的字段賦值只能作為聲明的一部分出現,或者出現在同一類的構造函數中。

可以說readonly一般只在構造器初始化的時候賦值,其余的時候不能改變他的值。

擴展方法

關於擴展方法,在用途上實際上用的不是很多,通常我們如果發現一個類所提供的方法不全時,我們會自己去寫一個別的方法代替,實際上擴展方法也是重寫一個方法的,但是擴展方法解決了三個問題,第一如果我們要獲取的東西在整個程序屬於常用的,但是如果我們只是額外寫一個普通方法,那麽調用上就會多一步,第二我們希望代碼的順序看起來更整潔也更加高大上。第三共用問題。

我們通過一個例子來看,如果我們想得到一個StringBuilder對象裏某個字符串出現的位置,我們可以寫一個獲取字符串第一次出現的方法,還是在剛才Student類中,我們定義了一個indeof方法,參數為StringBuilder和一個char類型

技術分享

如果我們想要調用上面的方法,那我們需要執行如下操作,先聲明一個StringBuilder對象,然後調用sb.Replace方法將.替換成!,然後獲得!第一次出現的位置,代碼執行時沒有任何問題,但是這串代碼並不理想,看起來很繁瑣

技術分享

但是如果我們將方法改變一下,只需要在參數前面加上this,這個方法就會變成StringBuilder類的擴展方法。技術分享

我們在重新去寫上邊代碼時,就可以很簡單的寫成下圖,方便理解,也符合代碼執行的邏輯程序。

技術分享

但是擴展方法不易亂用,尤其是在基類中擴展,其所有派生類都會有這個方法,很容易造成不應該出現的地方出現,另外擴展方法必須為頂級類,不能在嵌套類中使用擴展方法。擴展方法可以擴展很多種類型,包括但不限於,擴展委托,枚舉,接口。

CLR類型設計之方法與構造器