聲明:本文某些內(nèi)容摘自互聯(lián)網(wǎng),僅作學(xué)習(xí)之用!若無意侵犯你的權(quán)利,本人將在24小時內(nèi)刪除!
1.類的三大特性:封裝、繼承、多態(tài)。
2.類和結(jié)構(gòu)的區(qū)別:
a) 一個是值類型(結(jié)構(gòu)),一個是引用類型(類),結(jié)構(gòu)struct在傳遞的時候如果沒有指定ref,則傳遞的是內(nèi)存中的一分副本,而class則是傳遞對他的引用。
b) 類在堆中,結(jié)構(gòu)在棧中,類傳遞的是類在堆中的地址,而結(jié)構(gòu)是在棧中另復(fù)制了一個傳遞,你改變傳遞過來的結(jié)構(gòu)不會影響原結(jié)構(gòu)。而類是引用,共用一塊內(nèi)存,會改變堆中類的內(nèi)容。
c) 對于結(jié)構(gòu),不像類那樣存在繼承。一個結(jié)構(gòu)不能從另一個結(jié)構(gòu)或類繼承,而且不能作為一個類的基。但是,結(jié)構(gòu)從基類 Object 繼承。
3.new關(guān)鍵字的作用:
a) 作為運算符用來創(chuàng)建一個對象和調(diào)用構(gòu)造函數(shù)。
b) 作為修飾符。
c) 用于在泛型聲明中約束可能用作類型參數(shù)的參數(shù)的類型。
new作為修飾符的作用,在用作修飾符時,new關(guān)鍵字可以在派生類中隱藏基類的方法,也就說在使用派生類的方法是調(diào)用的方法是New關(guān)鍵字新定義出來的方法,而不是基類的方法。在不使用New關(guān)鍵字來隱藏基類方法也是可以的,編譯器會出現(xiàn)一個警告,提示如果有意去隱藏基類的方法,請使用New關(guān)鍵字修飾。
4.override和overload區(qū)別:
| Item | Override重寫(覆蓋) | Overload重載 |
| 位置 | 存在于繼承關(guān)系的類中 | 存在于同一類中 |
| 方法名 | 相同 | 相同 |
| 參數(shù)列表 | 相同 | 必須不同 |
| 返回值 | 相同 | 可以不 |
5.值類型和引用類型的區(qū)別:
聲明一個值類型變量,編譯器會在棧上分配一個空間,這個空間對應(yīng)著該值類型變量,空間里存儲的就是該變量的值。引用類型的實例分配在堆上,新建一個引用類型實例,得到的變量值對應(yīng)的是該實例的內(nèi)存分配地址。值類型的值是存放在堆棧中的,改變其值,不改變變量原有的值,而引用類型的值是存放在棧中的,其引用的地址是存放在堆棧中的,改變其值也就改變了變量原有的值。值類型不允許包含null值,然而可空類型可以將null賦值給值類型l。
| Item | 值類型 | 引用類型 |
| 內(nèi)存分配地點 | 分配在棧中 | 分配在堆中 |
| 效率 | 效率高,不需要地址轉(zhuǎn)換 | 效率低,需要進(jìn)行地址轉(zhuǎn)換 |
| 內(nèi)存回收 | 使用完后,立即回收 | 使用完后,不是立即回收,等待GC回收 |
| 賦值操作 | 進(jìn)行復(fù)制,創(chuàng)建一個同值新對象 | 只是對原有對象的引用 |
| 函數(shù)參數(shù)與返回值 | 是對象的復(fù)制 | 是原有對象的引用,并不產(chǎn)生新的對象 |
| 類型擴(kuò)展 | 不易擴(kuò)展 | 容易擴(kuò)展,方便與類型擴(kuò)展 |
6.死鎖的必要條件?如何避免?
1) 互斥條件:一個資源每次只能被一個進(jìn)程使用。
2) 請求與保持條件:一個進(jìn)程因請求資源而阻塞時,對已獲得的資源保持不放。
3) 不剝奪條件:進(jìn)程已獲得的資源,在末使用完之前,不能強行剝奪。
4) 循環(huán)等待條件:若干進(jìn)程之間形成一種頭尾相接的循環(huán)等待資源關(guān)系。
這四個條件是死鎖的必要條件,只要系統(tǒng)發(fā)生死鎖,這些條件必然成立,而只要上述條件之一不滿足,就不會發(fā)生死鎖。
死鎖排除的方法:
1)、撤消陷于死鎖的全部進(jìn)程;
2)、逐個撤消陷于死鎖的進(jìn)程,直到死鎖不存在;
3)、從陷于死鎖的進(jìn)程中逐個強迫放棄所占用的資源,直至死鎖消失。
4)、從另外一些進(jìn)程那里強行剝奪足夠數(shù)量的資源分配給死鎖進(jìn)程,以解除死鎖狀態(tài)
7.base、this關(guān)鍵字的含義?
1)base 關(guān)鍵字用于從派生類中訪問基類的成員:
調(diào)用基類上已被其他方法重寫的方法。
指定創(chuàng)建派生類實例時應(yīng)調(diào)用的基類構(gòu)造函數(shù)。
基類訪問只能在構(gòu)造函數(shù)、實例方法或?qū)嵗龑傩栽L問器中進(jìn)行。
2)this 關(guān)鍵字引用類的當(dāng)前實例。 new class()
以下是 this 的常用用途:
限定被相似的名稱隱藏的成員 public new
將對象作為參數(shù)傳遞到其他方法
聲明索引器。
8.抽象類和接口的異同?
1)抽象類:抽象類是特殊的類,只是不能被實例化;除此以外,具有類的其他特性;重要的是抽象類可以包括抽象方法,這是普通類所不能的。抽象方法只能聲明于抽象類中,且不包含任何實現(xiàn),派生類必須覆蓋它們。另外,抽象類可以派生自一個抽象類,可以覆蓋基類的抽象方法也可以不覆蓋,如果不覆蓋,則其派生類必須覆蓋它們。
2)接口是引用類型的,和抽象類的相似之處有三點:
a、不能實例化;
b、包含未實現(xiàn)的方法聲明;
c、派生類必須實現(xiàn)未實現(xiàn)的方法,抽象類是抽象方法,接口則是所有成員(不僅是方法包括其他成員);
d、接口除了可以包含方法之外,還可以包含屬性、索引器、事件,而且這些成員都被定義為公有的。除此之外,不能包含任何其他的成員,例如:常量、域、構(gòu)造函數(shù)、析構(gòu)函數(shù)、靜態(tài)成員。一個類可以直接繼承多個接口,但只能直接繼承一個類(包括抽象類)。
3)區(qū)別:
a、抽象類更多的是定義在一系列緊密相關(guān)的類間,而接口大多數(shù)是關(guān)系疏松但都實現(xiàn)某一功能的類中;
b、一個類一次可以實現(xiàn)若干個接口,但是只能擴(kuò)展一個父類;
c、接口可以用于支持回調(diào),而繼承并不具備這個特點;
d、抽象類不能被密封;
e、抽象類實現(xiàn)的具體方法默認(rèn)為虛的,但實現(xiàn)接口的類中的接口方法卻默認(rèn)為非虛的,當(dāng)然您也可以聲明為虛的。
f、抽象類實現(xiàn)了oop中的一個原則,把可變的與不可變的分離。抽象類和接口就是定義為不可變的,而把可變的座位子類去實現(xiàn);
g、好的接口定義應(yīng)該是具有專一功能性的,而不是多功能的,否則造成接口污染。如果一個類只是實現(xiàn)了這個接口的中一個功能,而不得不去實現(xiàn)接口中的其他方法,就叫接口污染;
h、盡量避免使用繼承來實現(xiàn)組建功能,而是使用黑箱復(fù)用,即對象組合。因為繼承的層次增多,造成最直接的后果就是當(dāng)你調(diào)用這個類群中某一類,就必須把他們?nèi)考虞d到棧中!后果可想而知.(結(jié)合堆棧原理理解)。同時,有心的朋友可以留意到微軟在構(gòu)建一個類時,很多時候用到了對象組合的方法。比如asp.net中,Page類,有Server Request等屬性,但其實他們都是某個類的對象。使用Page類的這個對象來調(diào)用另外的類的方法和屬性,這個是非常基本的一個設(shè)計原則。
i、如果抽象類實現(xiàn)接口,則可以把接口中方法映射到抽象類中作為抽象方法而不必實現(xiàn),而在抽象類的子類中實現(xiàn)接口中方法。
9.靜態(tài)成員和非靜態(tài)成員:
1)類的成員要么是靜態(tài)的,要么是動態(tài)的,如果將類的某個成員聲明為static,則該成員是靜態(tài)成員;
2)類的靜態(tài)成員是屬于類所有,不必產(chǎn)生類的實例就可以訪問它,就是只用類名就可以訪問;
3)靜態(tài)成員為類的所有實例所共享,無論這個類創(chuàng)建了多少個實例,一個靜態(tài)成員在內(nèi)存中只占有一塊區(qū)域;
4)類的非靜態(tài)成員屬于類的實例所有,每創(chuàng)建一個類的實例,都在內(nèi)存中為非靜態(tài)成員開辟了一塊區(qū)域;
5)靜態(tài)方法只能訪問類例的靜態(tài)
10.靜態(tài)類:
它們僅包含靜態(tài)成員。
它們不能被實例化。
它們是密封的。
它們不能包含實例構(gòu)造函數(shù)(C# 編程指南)。
因此創(chuàng)建靜態(tài)類與創(chuàng)建僅包含靜態(tài)成員和私有構(gòu)造函數(shù)的類大致一樣。私有構(gòu)造函數(shù)阻止類被實例化。
使用靜態(tài)類的優(yōu)點在于,編譯器能夠執(zhí)行檢查以確保不致偶然地添加實例成員。編譯器將保證不會創(chuàng)建此類的實利。
靜態(tài)類是密封的,因此不可被繼承。靜態(tài)類不能包含構(gòu)造函數(shù),但仍可聲明靜態(tài)構(gòu)造函數(shù)以分配初始值或設(shè)置某個靜態(tài)狀態(tài)。
11.collection和collections的區(qū)別:
Collection是集合類的上級接口,Collections是針對集合類的一個幫助類,它提供一系列靜態(tài)方法來實現(xiàn)對各種集合的搜索,排序,線程安全化操作。
12.堆和棧的區(qū)別:
Heap是堆,空間是由手動操作分配和釋放的,它的存儲區(qū)很大的自由存儲區(qū)。
Stack是棧,是由是操作系統(tǒng)自動分配和釋放的,棧上的空間是有限的。程序在編譯期間變量和函數(shù)分配內(nèi)存都是在棧上進(jìn)行的,且在運行時函數(shù)調(diào)用時的參數(shù)的傳遞也是在棧上進(jìn)行的。
13.readonly 關(guān)鍵字與 const 關(guān)鍵字:
const 字段只能在該字段的聲明中初始化。
readonly 字段可以在聲明或構(gòu)造函數(shù)中初始化。因此,根據(jù)所使用的構(gòu)造函數(shù),readonly 字段可能具有不同的值。
const 字段是編譯時常數(shù),而 readonly 字段可用于運行時常數(shù)。
const 默認(rèn)就是靜態(tài)的,而 readonly 如果設(shè)置成靜態(tài)的就必須顯示聲明。
const 對于引用類型的常數(shù),可能的值只能是 string 和 null。readonly可以是任何類型
14.進(jìn)程和線程:
進(jìn)程是比線程大的程序運行單元,都是由操作系統(tǒng)所體會的系統(tǒng)運行單元,一個程序中至少要有一個進(jìn)程,有一個進(jìn)程中,至少要有一個線程,線程的劃分尺度要比進(jìn)程要小,進(jìn)程擁有獨立的內(nèi)存單元,線程是共享內(nèi)存,從而極大的提高了程序的運行效率同一個進(jìn)程中的多個線程可以并發(fā)執(zhí)行。
15.什么叫應(yīng)用程序域?什么是托管代碼?什么是強類型系統(tǒng)?什么是裝箱和拆箱?什么是重載?CTS、CLS和CLR分別作何解釋?
應(yīng)用程序域:就是為安全性,可靠性,隔離性,和版本控制,及卸載程序提供的隔離邊界。它通常由運行庫宿主創(chuàng)建,應(yīng)用程序域提供了一個更安全,用途更廣的處理單元。
托管代碼:使用CLR編譯語言編輯器開發(fā)編寫的代碼就叫托管代碼。
裝箱和拆箱:是把值類型轉(zhuǎn)換為引用類型的過程,是隱式的,相反的過程就是拆箱,是顯式的。
CTS是公共類型系統(tǒng),CLS是公共語言規(guī)范,CLR公共語言運行庫。
強類型系統(tǒng):每個變量和對象都必須具有申明類型。
16.c#中類的默認(rèn)訪問修飾符,是private還是internal?
默認(rèn)是internal :
C#用多種修飾符來表達(dá)類的不同性質(zhì)。根據(jù)其保護(hù)級C#的類有五種不同的限制修飾符:
public可以被任意存取;
protected只可以被本類和其繼承子類存??;
internal只可以被本組合體(Assembly)內(nèi)所有的類存取,組合體是C#語言中類被組合后的邏輯單位和物理單位,其編譯后的文件擴(kuò)展名往往是“.DLL”或“.EXE”。
protected internal唯一的一種組合限制修飾符,它只可以被本組合體內(nèi)所有的類和這些類的繼承子類所存取。
private只可以被本類所存取。
如果不是嵌套的類,命名空間或編譯單元內(nèi)的類只有public和internal兩種修飾。
new修飾符只能用于嵌套的類,表示對繼承父類同名類型的隱藏。
abstract用來修飾抽象類,表示該類只能作為父類被用于繼承,而不能進(jìn)行對象實例化。抽象類可以包含抽象的成員,但這并非必須。abstract不能和new同時用。下面是抽象類用法的偽碼:
abstract class A
{
public abstract void F();
}
abstract class B: A
{
public void G() {}
}
class C: B
{
public override void F()
{
//方法F的實現(xiàn)
}
}
抽象類A內(nèi)含一個抽象方法F(),它不能被實例化。類B繼承自類A,其內(nèi)包含了一個實例方法G(),但并沒有實現(xiàn)抽象方法F(),所以仍然必須聲明為抽象類。類C繼承自類B,實現(xiàn)類抽象方法F(),于是可以進(jìn)行對象實例化。
sealed用來修飾類為密封類,阻止該類被繼承。同時對一個類作abstract和sealed的修飾是沒有意義的,也是被禁止的。
17.c# 類的public private internal protected的區(qū)別:
public 修飾的類,可以在整個系統(tǒng)的任意地方調(diào)用,是完全公開的;
private 相反的,只能在類內(nèi)部調(diào)用.任何實例,無法調(diào)用private調(diào)用;
internal 僅為同項目(這里的項目是只單獨的項目,而不是整個解決方案)調(diào)用,或者說同一命名空間內(nèi)調(diào)用;
protected 自己及自己的子類可以調(diào)用
18.error和exception
Error和Exception都繼承自Throwable,他們下列不同處:
Exceptions
1.可以是 可被控制(checked) 或 不可控制的(unchecked)
2.表示一個由程序員導(dǎo)致的錯誤
3.應(yīng)該在應(yīng)用程序級被處理
Errors
1.總是 不可控制的(unchecked)
2.經(jīng)常用來用于表示系統(tǒng)錯誤或低層資源的錯誤
3.如何可能的話,應(yīng)該在系統(tǒng)級被捕捉
浙公網(wǎng)安備 33010602011771號