西安疫情社會(huì)面最新消息南京百度seo公司
重載和重寫(xiě)的區(qū)別
方法重載:在同一個(gè)類(lèi)中定義多個(gè)同名但參數(shù)不同的方法。
方法重寫(xiě):通過(guò)使用 virtual 和 override 關(guān)鍵字,實(shí)現(xiàn)基類(lèi)和派生類(lèi)之間的方法重寫(xiě)。
重載發(fā)生在同類(lèi)中,重寫(xiě)發(fā)生在父子類(lèi)中
重載方法名相同參數(shù)不同,重寫(xiě)方法名和參數(shù)列表都相同
面向?qū)ο蟮娜筇攸c(diǎn)
封裝,繼承,多態(tài)
繼承能夠提高代碼重用度,增強(qiáng)可維護(hù)性。繼承最主要的作用就是把子類(lèi)的公共屬性集合起來(lái),便于共同管理,使用起來(lái)更加方便
繼承的傳遞性:b繼承a,c繼承b,c也有a的特性
繼承的單根性:C#中一個(gè)類(lèi)只能繼承一個(gè)類(lèi),不能有多個(gè)父類(lèi)
繼承是實(shí)現(xiàn)多態(tài)的重要手段,通過(guò)基類(lèi)引用指向派生類(lèi)對(duì)象,可以實(shí)現(xiàn)動(dòng)態(tài)綁定。
封裝是將數(shù)據(jù)(屬性)和操作數(shù)據(jù)的方法(行為)相結(jié)合,并限制外部直接訪問(wèn)數(shù)據(jù)的能力。保護(hù)對(duì)象的內(nèi)部狀態(tài),同時(shí)提供公共方法讓外部訪問(wèn),增強(qiáng)數(shù)據(jù)的安全性(private,public修飾符)
多態(tài)性:通過(guò)統(tǒng)一的接口來(lái)調(diào)用不同類(lèi)的對(duì)象,從而實(shí)現(xiàn)統(tǒng)一操作有不同的表現(xiàn)形式。兩種主要形式為重載和重寫(xiě)
值類(lèi)型和引用類(lèi)型的區(qū)別
值類(lèi)型、引用類(lèi)型是根據(jù)數(shù)據(jù)存儲(chǔ)的?度來(lái)分的)就是值類(lèi)型用于存儲(chǔ)數(shù)據(jù)的值,引用類(lèi)型用于存儲(chǔ)對(duì)實(shí)際數(shù)據(jù)的引用。
值類(lèi)型包含了所有簡(jiǎn)單類(lèi)型(bool,char,int,float,enum,struct),繼承自基類(lèi)System.ValueType
引用類(lèi)型包含了string,object,class,interface,delegate,繼承自基類(lèi)System.Object
1.值類(lèi)型變量直接把變量的值保存在堆棧中,引?類(lèi)型的變量把實(shí)際數(shù)據(jù)的地址保存在堆棧中。
2.值存取快,引用類(lèi)型存取慢
3.值類(lèi)型表示實(shí)際數(shù)據(jù),引用類(lèi)型表示儲(chǔ)存在內(nèi)存堆中的數(shù)據(jù)的指針和引用
4.值類(lèi)型的變量直接存放實(shí)際的數(shù)據(jù),引用類(lèi)型的變量存放的是數(shù)據(jù)的地址,即對(duì)象的引用
private,public,protected的區(qū)別
public:對(duì)任何類(lèi)和成員都公開(kāi),無(wú)限制訪問(wèn)
private:僅對(duì)該類(lèi)公開(kāi)
protected:對(duì)該類(lèi)及其派生類(lèi)公開(kāi)
ArrayList和List的主要區(qū)別
ArrayList 是非泛型集合,存儲(chǔ)的數(shù)據(jù)類(lèi)型為 object。他可以存儲(chǔ)任何類(lèi)型的對(duì)象,但在使用時(shí)需要進(jìn)行類(lèi)型轉(zhuǎn)換(裝箱和拆箱),可能導(dǎo)致運(yùn)行時(shí)錯(cuò)誤。
由于需要進(jìn)行裝箱和拆箱,ArrayList 在處理值類(lèi)型時(shí)性能較低。此外,由于其對(duì)每個(gè)元素都必須進(jìn)行類(lèi)型檢查,因此在性能上也劣于 List。
List:
List 是泛型集合,提供類(lèi)型參數(shù) T,確保在編譯時(shí)就能檢查類(lèi)型,避免了類(lèi)型轉(zhuǎn)換問(wèn)題。因此,它更安全且性能更高。
List 提供更好的性能,因?yàn)樗恍枰M(jìn)行裝箱和拆箱,且能夠直接操作指定的類(lèi)型。
GC(垃圾回收)產(chǎn)生的原因,如何避免?
為了避免內(nèi)存溢出而產(chǎn)生的回收機(jī)制
如何避免:
減少new產(chǎn)生對(duì)象的次數(shù)
使用公共的的對(duì)象(靜態(tài)成員)
將String轉(zhuǎn)換為StringBuilder
interface和抽象類(lèi)之間的不同
接口是一種完全抽象的類(lèi)型,定義了一組方法、屬性、事件或索引器,但不提供任何實(shí)現(xiàn)。
抽象類(lèi)是一種包含部分實(shí)現(xiàn)的類(lèi),可以包含抽象方法(沒(méi)有實(shí)現(xiàn))和具體方法(有實(shí)現(xiàn))。
接口用于定義一組功能,這些功能可以被多個(gè)類(lèi)實(shí)現(xiàn)。通過(guò)接口,可以確保不同的類(lèi)具有一致的功能契約。
抽象類(lèi)用于提供一個(gè)基礎(chǔ)類(lèi),允許子類(lèi)繼承并重用代碼,同時(shí)也強(qiáng)制子類(lèi)實(shí)現(xiàn)特定的方法。
接口可以多繼承,抽象類(lèi)是單繼承(一個(gè)類(lèi)只能繼承自一個(gè)抽象類(lèi))
接口中的成員默認(rèn)都是 public,不能使用其他訪問(wèn)修飾符(如 private 或 protected)。
抽象類(lèi)中的成員可以有多種訪問(wèn)修飾符(如 public、protected、private),提供了更靈活的訪問(wèn)控制。
關(guān)鍵字Sealed用在類(lèi)聲明和函數(shù)聲明時(shí)的作用
類(lèi)聲明時(shí)可防止其他類(lèi)繼承此類(lèi),在方法中聲明則可防止派生類(lèi)重寫(xiě)此方法。
反射的實(shí)現(xiàn)原理
可以在加載程序運(yùn)行時(shí)動(dòng)態(tài)獲取和加載程序集,并且可以獲取到程序集的信息反射,是在運(yùn)行期動(dòng)態(tài)獲取類(lèi),方法,對(duì)象,對(duì)象數(shù)據(jù)的一種手段
主要使用的類(lèi)庫(kù):System.Reflection
核心類(lèi):
Assembly描述了程序集
Type描述了類(lèi)這種類(lèi)型
ConstructorInfo描述了構(gòu)造函數(shù)
MethodInfo描述了所有的方法
FieldInfo描述了類(lèi)的字段
PropertyInfo描述類(lèi)的屬性
在類(lèi)的構(gòu)造函數(shù)前加上static會(huì)報(bào)什么錯(cuò)?為什么?
C# 中有靜態(tài)構(gòu)造函數(shù),使用 static 修飾符定義,用于初始化類(lèi)的靜態(tài)成員。靜態(tài)構(gòu)造函數(shù)在類(lèi)被加載到內(nèi)存中時(shí)執(zhí)行,且只執(zhí)行一次,而不是在創(chuàng)建類(lèi)的實(shí)例時(shí)執(zhí)行。因此,靜態(tài)構(gòu)造函數(shù)與常規(guī)構(gòu)造函數(shù)的目的和用法是不同的。
靜態(tài)成員(變量和方法)屬于類(lèi)本身,而不是類(lèi)的實(shí)例。
可以通過(guò)類(lèi)名直接訪問(wèn)靜態(tài)成員,無(wú)需創(chuàng)建對(duì)象。
C#中常見(jiàn)的容器類(lèi)
Stack:先進(jìn)后出,入棧和出棧,底層泛型數(shù)組實(shí)現(xiàn),入棧動(dòng)態(tài)擴(kuò)容二倍
Queue:先進(jìn)先出,入隊(duì)和出隊(duì),底層泛型數(shù)組實(shí)現(xiàn),表頭表尾指針,判空通過(guò)size比較
Array數(shù)組:需要聲明長(zhǎng)度,不安全
ArrayList數(shù)組列表:動(dòng)態(tài)增加數(shù)組,不安全,實(shí)現(xiàn)了IList接口,Object數(shù)組實(shí)現(xiàn)
List列表:底層是泛型數(shù)組,動(dòng)態(tài)擴(kuò)容(將泛型數(shù)據(jù)存儲(chǔ)在一個(gè)泛型數(shù)組中,添加元素時(shí)若超過(guò)當(dāng)前泛型數(shù)組容量則二倍擴(kuò)容,實(shí)現(xiàn)List大小動(dòng)態(tài)可變
LinkList鏈表:底層由鏈表實(shí)現(xiàn),數(shù)組插入刪除效率高,且不用動(dòng)態(tài)擴(kuò)容數(shù)組
C#中常規(guī)容器和泛型容器有什么區(qū)別
不帶泛型的容器需要裝箱拆箱操作速度慢。泛型容器更高效更安全
常見(jiàn)的數(shù)值類(lèi)
簡(jiǎn)單值類(lèi)型:int類(lèi)型,bool類(lèi)型,char類(lèi)型
復(fù)合值類(lèi)型:結(jié)構(gòu)類(lèi)型,枚舉類(lèi)型
C#中委托 和 接口有什么區(qū)別?各用在什么場(chǎng)合?
委托用于表示對(duì)一個(gè)或多個(gè)方法的引用,使得可以將方法作為參數(shù)傳遞或進(jìn)行回調(diào)操作。它常用于事件處理和異步編程,以便在特定條件下調(diào)用指定的方法。更側(cè)重于方法的調(diào)用和執(zhí)行,適用于事件和回調(diào)場(chǎng)景。
接口則關(guān)注類(lèi)的行為和功能定義,適用于需要實(shí)現(xiàn)契約、增強(qiáng)系統(tǒng)靈活性和可維護(hù)性的情況。類(lèi)通過(guò)實(shí)現(xiàn)接口來(lái)遵循一定的契約,這種設(shè)計(jì)促進(jìn)了代碼的解耦合和可擴(kuò)展性。接口支持多重繼承,可以讓不同的類(lèi)以相同的方式響應(yīng)某些操作,從而實(shí)現(xiàn)多態(tài)。
C#中unsafe關(guān)鍵字是用來(lái)做什么的?什么場(chǎng)合下使用?
非托管代碼才需要這個(gè)關(guān)鍵字,一般用在帶指針操作的場(chǎng)合。
項(xiàng)目背包系統(tǒng)的任務(wù)裝備欄使用到
C#中ref和out關(guān)鍵字有什么區(qū)別?
ref修飾引用參數(shù)。參數(shù)必須賦值,帶回返回值,又進(jìn)又出
out修飾輸出參數(shù)。參數(shù)可以不賦值,帶回返回值之前必須明確賦值,
引用參數(shù)和輸出參數(shù)不會(huì)創(chuàng)建新的存儲(chǔ)位置
如果ref參數(shù)是值類(lèi)型,原先的值類(lèi)型數(shù)據(jù),會(huì)隨著方法里的數(shù)據(jù)改變而改變,
如果ref參數(shù)值引用類(lèi)型,方法里重新賦值后,原對(duì)象堆中數(shù)據(jù)會(huì)改變,如果對(duì)引用類(lèi)型再次創(chuàng)建新對(duì)象并賦值給ref參數(shù),引用地址會(huì)重新指向新對(duì)象堆數(shù)據(jù)。方法結(jié)束后形參和新對(duì)象都會(huì)消失。實(shí)參還是指向原始對(duì)象,值不夠數(shù)據(jù)改變了
For,foreach,Enumerator.MoveNext的使用,與內(nèi)存消耗情況
for循環(huán)可以通過(guò)索引依次進(jìn)行遍歷,foreach和Enumerator.MoveNext通過(guò)迭代的方式進(jìn)行遍歷。
內(nèi)存消耗上本質(zhì)上并沒(méi)有太大的區(qū)別。
但是在Unity中的Update中,一般不推薦使用foreach 因?yàn)闀?huì)遺留內(nèi)存垃圾。
函數(shù)中多次使用string的+=處理,會(huì)產(chǎn)生大量?jī)?nèi)存垃圾(垃圾碎片),有什么好的方法可以解決。
通過(guò)StringBuilder那進(jìn)行append,這樣可以減少內(nèi)存垃圾
當(dāng)需要頻繁創(chuàng)建使用某個(gè)對(duì)象時(shí),有什么好的程序設(shè)計(jì)方案來(lái)節(jié)省內(nèi)存?
設(shè)計(jì)單例模式進(jìn)行創(chuàng)建對(duì)象或者使用對(duì)象池
Foreach循環(huán)迭代時(shí),若把其中的某個(gè)元素刪除,程序報(bào)錯(cuò),怎么找到那個(gè)元素?以及具體怎么處理這種情況?(注:Try…Catch捕捉異常,發(fā)送信息不可行)
foreach不能進(jìn)行元素的刪除,因?yàn)榈鲿?huì)鎖定迭代的集合,解決方法:記錄找到索引或者key值,迭代結(jié)束后再進(jìn)行刪除。
GameObject a=new GameObject() GameObject b=a 實(shí)例化出來(lái)了A,將A賦給B,現(xiàn)在將B刪除,問(wèn)A還存在嗎?
存在,b刪除只是將它在棧中的內(nèi)存刪除,而A對(duì)象本身是在堆中,所以A還存在
C#中委托和事件的區(qū)別
委托就是用來(lái)存儲(chǔ)方法的引用,讓你可以方便地調(diào)用這些方法。你可以把一個(gè)方法“放進(jìn)”委托中,并在需要的時(shí)候通過(guò)這個(gè)委托來(lái)“呼叫”它。這使得代碼更加靈活,因?yàn)槟憧梢愿鶕?jù)需要選擇不同的方法來(lái)執(zhí)行。
事件就是一種機(jī)制,用來(lái)讓對(duì)象之間互相通知。當(dāng)某個(gè)事情發(fā)生了(比如一個(gè)按鈕被點(diǎn)擊),你可以觸發(fā)這個(gè)事件,已注冊(cè)的處理程序都會(huì)收到通知,并可以做出相應(yīng)的反應(yīng)。
- 觸發(fā)委托有兩種方式:委托實(shí)例Invoke(參數(shù)列表),委托實(shí)例(參數(shù)列表)
- 通過(guò)+=為事件注冊(cè)多個(gè)委托實(shí)例或多個(gè)方法
- 通過(guò)-=為事件注銷(xiāo)多個(gè)委托實(shí)例或多個(gè)方法
- EventHandler就是一個(gè)委托
結(jié)構(gòu)體和類(lèi)有何區(qū)別
結(jié)構(gòu)體是一種值類(lèi)型,而類(lèi)是引用類(lèi)型
結(jié)構(gòu)體是當(dāng)成值來(lái)使用的,類(lèi)則通過(guò)引用對(duì)實(shí)際數(shù)據(jù)操作
C#的委托是什么?有何用處
委托類(lèi)似于一種安全的指針引用,在使用它時(shí)時(shí)當(dāng)作類(lèi)看待而不是一個(gè)方法,相當(dāng)于對(duì)一組方法的列表的引用
用處:使用委托使程序員可以將方法引用封裝在委托對(duì)象內(nèi),然后可以將該委托對(duì)象傳遞給可調(diào)用所引用方法的代碼,而不必在編譯時(shí)知道調(diào)用哪個(gè)方法。與C或C++中的函數(shù)指針不同,委托使面向?qū)ο?#xff0c;而且是類(lèi)型安全的
foreach迭代器遍歷和for循環(huán)遍歷的區(qū)別
foreach:只能通過(guò)集合的迭代器直接訪問(wèn)元素,不能直接使用索引。這意味著你無(wú)法在循環(huán)中修改集合的結(jié)構(gòu)(例如,添加或刪除元素),否則將拋出異常。
for:可以通過(guò)索引直接訪問(wèn)元素,可以靈活地使用索引進(jìn)行操作。如果需要在遍歷期間對(duì)集合進(jìn)行修改,通常更容易實(shí)現(xiàn)。
foreach遍歷原理
任何集合類(lèi)(Array)對(duì)象都有一個(gè)GetEnumerator()方法,該方法可以返回一個(gè)實(shí)現(xiàn)了 IEnumerator接口的對(duì)象。
這個(gè)返回的IEnumerator對(duì)象既不是集合類(lèi)對(duì)象,也不是集合的元素類(lèi)對(duì)象,它是一個(gè)獨(dú)立的類(lèi)對(duì)象。
通過(guò)這個(gè)實(shí)現(xiàn)了 IEnumerator接口對(duì)象A,可以遍歷訪問(wèn)集合類(lèi)對(duì)象中的每一個(gè)元素對(duì)象
對(duì)象A訪問(wèn)MoveNext方法,方法為真,就可以訪問(wèn)Current方法,讀取到集合的元素。
C#引用和C++指針的區(qū)別
C#不支持指針,但可以使用Unsafe,不安全模式,CLR不檢測(cè)
C#可以定義指針的類(lèi)型、整數(shù)型、實(shí)數(shù)型、struct結(jié)構(gòu)體
C#指針操作符、C#指針定義 使用fixed,可以操作類(lèi)中的值類(lèi)型
相同點(diǎn):都是地址
指針指向一塊內(nèi)存,它的內(nèi)容是所指內(nèi)存的地址;而引用則是某塊內(nèi)存的別名。
不同點(diǎn):
指針是個(gè)實(shí)體,引用是個(gè)別名。
sizeof 引用”得到的是所指向的變量(對(duì)象)的大小,而“sizeof 指針”得到的是指針本身的大小;
引用是類(lèi)型安全的,而指針在不安全模式下
堆和棧的區(qū)別
棧:用于存儲(chǔ)局部變量和方法調(diào)用信息。當(dāng)一個(gè)方法被調(diào)用時(shí),相關(guān)的局部變量、參數(shù)和返回地址等信息會(huì)被壓入棧中;當(dāng)方法執(zhí)行結(jié)束,這些信息會(huì)被彈出。
內(nèi)存的分配和釋放非??焖偾腋咝?#xff0c;因?yàn)樗恍枰苿?dòng)棧指針。棧中的內(nèi)存是自動(dòng)管理的,當(dāng)方法結(jié)束時(shí),??臻g會(huì)自動(dòng)釋放。
存儲(chǔ)在棧上的變量具有塊作用域,一旦超出其作用域或方法結(jié)束,變量就會(huì)被銷(xiāo)毀。
主要存放值類(lèi)型及方法調(diào)用的信息
堆:堆是一種用于動(dòng)態(tài)分配內(nèi)存的數(shù)據(jù)區(qū)域,通常用于存儲(chǔ)對(duì)象和數(shù)據(jù)結(jié)構(gòu)。通過(guò) new 關(guān)鍵字創(chuàng)建的對(duì)象都會(huì)在堆上分配內(nèi)存,這些對(duì)象的生命周期由垃圾回收器(GC)管理。
內(nèi)存的分配和釋放相對(duì)較慢,因?yàn)樗枰檎铱臻e塊并管理復(fù)雜的內(nèi)存碎片。堆中的內(nèi)存由程序員通過(guò) new 分配,并由垃圾回收器負(fù)責(zé)最終釋放。
存儲(chǔ)在堆上的對(duì)象的生命周期不受作用域限制,只要有引用指向該對(duì)象,它就會(huì)繼續(xù)存在,直到?jīng)]有引用時(shí)才會(huì)被垃圾回收器回收。
主要用于存放引用類(lèi)型以及動(dòng)態(tài)分配的對(duì)象
什么是裝箱拆箱,怎樣減少操作
C#裝箱是將值類(lèi)型轉(zhuǎn)換為引用類(lèi)型;
拆箱是將引用類(lèi)型轉(zhuǎn)換為值類(lèi)型。
牽扯到裝箱和拆箱操作比較多的就是在集合中,例如:ArrayList或者HashTable之類(lèi)。
MVC
MVC全名是Model View Controller,是模型(model)-視圖(view)-控制器(controller)的縮寫(xiě),一種軟件設(shè)計(jì)典范。
用一種業(yè)務(wù)邏輯、數(shù)據(jù)、界面顯示分離的方法,將業(yè)務(wù)邏輯聚集到一個(gè)部件里面,在改進(jìn)和個(gè)性化定制界面及用戶(hù)交互的同時(shí),不需要重新編寫(xiě)業(yè)務(wù)邏輯。MVC被獨(dú)特的發(fā)展起來(lái)用于映射傳統(tǒng)的輸入、處理和輸出功能在一個(gè)邏輯的圖形化用戶(hù)界面的結(jié)構(gòu)中。
Model(模型)是應(yīng)用程序中用于處理應(yīng)用程序數(shù)據(jù)邏輯的部分。
通常模型對(duì)象負(fù)責(zé)在數(shù)據(jù)庫(kù)中存取數(shù)據(jù)。
View(視圖)是應(yīng)用程序中處理數(shù)據(jù)顯示的部分。
通常視圖是依據(jù)模型數(shù)據(jù)創(chuàng)建的。
Controller(控制器)是應(yīng)用程序中處理用戶(hù)交互的部分。
通??刂破髫?fù)責(zé)從視圖讀取數(shù)據(jù),控制用戶(hù)輸入,并向模型發(fā)送數(shù)據(jù)
字典Dictionary的內(nèi)部實(shí)現(xiàn)原理
Dictionary 是基于哈希表實(shí)現(xiàn)的,哈希表使用哈希函數(shù)將鍵(key)映射到數(shù)組中的存儲(chǔ)桶(bucket)中。在 Dictionary 中,每個(gè)鍵值對(duì)由一個(gè)鍵和相應(yīng)的值組成。
如果多個(gè)鍵的哈希值沖突(即它們被映射到同一個(gè)桶),則這些鍵值對(duì)會(huì)以鏈表的形式存儲(chǔ)在該桶內(nèi)。這種沖突解決方法稱(chēng)為鏈?zhǔn)缴⒘小?br /> 通常用于快速查找和管理映射關(guān)系,適合需要快速訪問(wèn)的數(shù)據(jù)存儲(chǔ)場(chǎng)景。
C#中的泛型是什么
在定義泛型類(lèi)或方法時(shí),可以使用一個(gè)或多個(gè)類(lèi)型參數(shù)來(lái)代替實(shí)際的數(shù)據(jù)類(lèi)型。
泛型可以減少裝箱和拆箱的開(kāi)銷(xiāo),因?yàn)樗鼈冊(cè)试S值類(lèi)型被直接存儲(chǔ),而無(wú)需轉(zhuǎn)換為對(duì)象??梢蕴岣咝阅?#xff0c;減少不必要的類(lèi)型轉(zhuǎn)換,同時(shí)保持代碼的靈活性和可維護(hù)性。
C# 中的泛型提供了創(chuàng)建可重用、類(lèi)型安全的代碼的能力。
泛型可以用于類(lèi)、方法和接口,并且支持多種類(lèi)型約束。
反射的實(shí)現(xiàn)原理?
可以在加載程序運(yùn)行時(shí),動(dòng)態(tài)獲取和加載程序集,并且可以獲取到程序集的信息反射即在運(yùn)行期動(dòng)態(tài)獲取類(lèi)、對(duì)象、方法、對(duì)象數(shù)據(jù)等的一種重要手段
主要使用的類(lèi)庫(kù):System.Reflection
核心類(lèi):
- Assembly描述了程序集
- Type描述了類(lèi)這種類(lèi)型
- ConstructorInfo描述了構(gòu)造函數(shù)
- MethodInfo描述了所有的方法
- FieldInfo描述了類(lèi)的字段
- PropertyInfo描述類(lèi)的屬性
通過(guò)以上核心類(lèi)可在運(yùn)行時(shí)動(dòng)態(tài)獲取程序集中的類(lèi),并執(zhí)行類(lèi)構(gòu)造產(chǎn)生類(lèi)對(duì)象,動(dòng)態(tài)獲取對(duì)象的字段或?qū)傩灾?#xff0c;更可以動(dòng)態(tài)執(zhí)行類(lèi)方法和實(shí)例方法等。
C#中四種訪問(wèn)修飾符是哪些?各有什么區(qū)別?
屬性修飾符
存取修飾符
類(lèi)修飾符
成員修飾符