類的繼承 sealed關鍵字總結

2022-08-20 12:54:15 字數 2195 閱讀 1839

第五周總結

類的繼承

繼承是物件導向程式設計的乙個重要特性,任何類都可以從另乙個類中繼承,這就是說,這個類擁有它繼承的類的所有成員。在c#中,被繼承的類稱為父類(也稱為基類)。

注意,c#中的物件僅能直接派生於乙個基類,當然基類也可以有自己的基類。

其次類的繼承乙個重要作用是子類可重用父類的**。這樣就可以在乙個地方集中維護乙份**,避免了很多的重複的**。

基類的初始化

派生類繼承了基類的成員變數和成員方法。因此父類物件應在子類物件建立之前被建立。您可以在成員初始化列表中進行父類的初始化。

注意:c#不支援多重繼承。但是,可以使用介面來實現多重繼承。

繼承規則:

1、派生類自動包含基類的所有成員。但對於基類的私有成員,派生類雖然繼承了,但是不能在派生類中訪問。

2、所有的類都是按照繼承鏈從頂層基類開始向下順序構造。最頂層的基類是system.object類,所有的類都隱式派生於它。只要記住這條規則,就能理解派生類在例項化時對建構函式的呼叫過程。

隱藏基類的方法

隱藏基類方法和重寫基類方法的一點區別,二者都是在派生類中定義了與基類中相同的方法,相同點派生類物件將執行各自的派生類中的方法,不同點,在向上轉型後,重寫基類方法用的是派生類的方法,而隱藏基類呼叫的是基類的方法,

裝箱與拆箱

裝箱與拆箱:在實際開發過程中,某些方法的引數型別為引用型別,但是如果傳入的是值型別,此時需要進行裝箱操作。同樣當乙個方法的返回值型別為值型別,但實際方法返回值是引用型別,那麼就需要進行拆箱操作。簡單來說,裝箱就是將值型別

一、為什麼需要裝箱(為何要將值型別轉為引用型別?)

一種最普通的場景是,呼叫乙個含型別為object的引數的方法,該object可支援任意為型,以便通用。當你需要將乙個值型別(如int32)傳入時,需要裝箱。

另一種用法是,乙個非泛型的容器,同樣是為了保證通用,而將元素型別定義為object。於是,要將值型別資料加入容器時,需要裝箱。

二、裝箱和拆箱的內部操作是什麼樣的?

.net中,資料型別劃分為值型別和引用(不等同於c++的指標)型別,與此對應,記憶體分配被分成了兩種方式,一為棧,二為堆,注意:是託管堆。 值型別只會在棧中分配。 引用型別分配記憶體與託管堆。(託管堆對應於垃圾**。) 裝箱操作:

1:首先從託管堆中為新生成的引用物件分配記憶體(大小為值型別例項大小加上乙個方法表指標和乙個syncblockindex)。

2:然後將值型別的資料拷貝到剛剛分配的記憶體中。

可以看出,進行一次裝箱要進行分配記憶體和拷貝資料這兩項比較影響效能的操作。

拆箱操作:

1、首先獲取託管堆中屬於值型別那部分欄位的位址,這一步是嚴格意義上的拆箱。

2、將引用物件中的值拷貝到位於執行緒堆疊上的值型別例項中。

經過這2步,可以認為是同boxing是互反操作。嚴格意義上的拆箱,並不影響效能,但伴隨這之後的拷貝資料的操作就會同boxing操作中一樣影響效能。

三、裝箱/拆箱對執行效率的影響

顯然,從原理上可以看出,裝箱時,生成的是全新的引用物件,這會有時間損耗,也就是造成效率降低。 那該如何做呢?

首先,應該盡量避免裝箱。

有兩種情況,在第一種情況下,可以通過過載函式來避免。第二種情況,則可以通過泛型來避免。

當然,凡事並不能絕對,假設你想改造的**為第三方程式集,你無法更改,那你只能是裝箱了。

對於裝箱/拆箱**的優化,由於c#中對裝箱和拆箱都是隱式的,所以,根本的方法是對**進行分析,而分析最直接的方式是了解原理結何檢視反編譯的il**。比如:在迴圈體中可能存在多餘的裝箱,你可以簡單採用提前裝箱方式進行優化。

sealed關鍵字

sealed關鍵字:在c#中,使用sealed關鍵字修飾的類不可以繼承,也就是說不能派生子類,這樣的類通常被稱為密封類,在哪些場合下使用密封類呢?密封類可以阻止其它程式設計師在無意中繼承該類。而且密封類可以起到執行時優化的效果。實際上,密封類中不可能有派生類。如果密封類例項中存在虛成員函式,該成員函式可以轉化為非虛的,函式修飾符virtual 不再生效。

在c#中,sealed關鍵字有兩個作用

1. 為了確保其他類不可以派生於某乙個類,可以使用sealed關鍵字密封該類,防止其他類繼承自該類;

注意: 密封類中不能包含虛方法(virtual)和抽象方法(abstract),因為在密封的類沒有為派生類提供實現其虛方法和抽象方法的機會。

2.限制其他派生類重寫在當前類中提供的方法實現

sealed關鍵字的作用

sealed關鍵字的作用 在類宣告中使用sealed可防止其它類繼承此類 在方法宣告中使用sealed修飾符可防止擴充類重寫此方法。sealed修飾符主要用於防止非有意的派生,但是它還能促使某些執行時優化。具體說來,由於密封類永遠不會有任何派生類,所以對密封類的例項的虛函式成員的呼叫可以轉換為非虛擬...

sealed(密封)關鍵字

sealed的 中文意思是密封,故名思義,就是由它修飾的類或方法將不能被繼承或是重寫。sealed關鍵字的作用 在類宣告中使用sealed可防止其它類繼承此類 在方法宣告中使用sealed修飾符可防止擴充類重寫此方法。sealed修飾符主要用於防止非有意的派生,但是它還能促使某些執行時優化。具體說來...

C 關鍵字掃盲 Sealed 密封

sealed官方描述 應用於某個類時,sealed 修飾符可阻止其他類繼承自該類。還可以對替代基類中的虛方法或屬性的方法或屬性使用 sealed 修飾符。這使你可以允許類派生自你的類並防止它們替代特定虛方法或屬性。專案 learnsealed 環境vs2017 net core2.0 應用於方法或屬...