前言
隨著上一節我們對StringBulider的講解落下帷幕,c#核心的知識點我們也即將告一段落,我們講完了面向對象要用的三大特性(封裝,繼承,多態)和七大原則。期中自然也不乏一些小的散的碎的的知識點。
今天我們要講的也正如標題所說,是面試里經常用來開門拷打你的問題。
所以我們今天主要講結論(為了幫助你更好的背誦來對付面試),至于為什么,或者說你想探究他的深層原理,那博主可能就愛能莫助了,我們今天在這里都只會進行很簡單的探討(因為博主水平還沒那么厲害,足夠厲害了再發一篇講的更細的),大家主要記住結論。
自然,你想自己根據先前學的知識自己梳理一下也是可以的。
在這節,我們也會簡單探討一下使用的場景和情況,供大家參考。
結構體和類的區別
區別概述
- 結構體和類最大的區別在存儲空間上,結構體是值類型,類是引用類型。
- 這意味著,結構體的存儲空間在棧上,類的存儲空間在堆上
- 結構體有封裝,但是無繼承和多態,也就是說不能使用protected
- 結構體的賦值不能為空,類可以。
細節區別
-
結構體成員變量申明指定初始值?
-
結構體不能申明無參構造函數,析構函數
-
需要你進一步專研
結構體的特別之處
結構體可以繼承接口,因為接口是行為的抽象,接口是一種只包含方法、屬性、事件和索引器的抽象類型,定義了對象應有的行為。它們不依賴于特定的實現,因此結構體和類都可以實現相同的接口。
如何選擇
- 用繼承多態的場景選類
- 數據結合為對象優先結構體(類也可以,但是不建議)
- 值和引用類型的考慮
抽象類和接口的區別
相同點
-
都可以被繼承
-
都不能直接實例化
-
都可以包含方法的申明?
-
子類必須實現沒有實現的方法
-
滿足里氏替換原則
區別
-
抽象類中可以有構造函數 ,接口不行
-
抽象類是單一繼承,但是接口可以繼承多個
-
抽象類中可以有成員變量
-
抽象類中也可以申明方法
-
抽象類中有訪問修飾符
選擇?
區別對象和行為的差距,然后在抽象類和接口中進行選擇。這兩個都是為了規范出現的東西,母的是幫助我們更好規范我們的編程行為。
總結
在本節中,我們深入探討了 C# 中結構體和類以及抽象類和接口的相關知識,為應對面試提供關鍵結論。主要學習了以下要點:
- 結構體和類的區別
- 核心差異:結構體為值類型,存儲于棧上;類是引用類型,存儲在堆上。結構體僅有封裝,無繼承與多態,不能用 protected;類具備封裝、繼承和多態。結構體賦值不可為空,類則可以。
- 細節特性:結構體成員變量聲明不能指定初始值,且無法聲明無參構造函數和析構函數。不過,結構體能夠繼承接口,因其抽象行為不依賴特定實現,與類一樣可實現相同接口。
- 應用場景:涉及繼承多態時優先選類;將數據組合為對象,結構體是較好選擇(類雖也能實現,但不推薦)。
- 抽象類和接口的區別
- 共同特性:二者均可被繼承,不能直接實例化,可包含方法聲明,子類必須實現未實現的方法,均遵循里氏替換原則。
- 不同之處:抽象類有構造函數,接口沒有;抽象類是單一繼承,接口可多重繼承;抽象類可擁有成員變量、聲明方法并設置訪問修飾符。
- 選用準則:依據對象與行為的差異,在抽象類和接口間抉擇,它們的存在旨在規范編程行為。
請期待我的下一篇博客!
期待您的關注與支持,感謝您對于佑夢游戲開發的關注!