c#基礎知識20問

來源:互聯網
上載者:User

聲明:本文某些內容摘自互連網,僅作學習之用!若無意侵犯你的權利,本人將在24小時內刪除!
1.類的三大特性:封裝、繼承、多態。

2.類和結構的區別:
a)     一個是實值型別(結構),一個是參考型別(類),結構struct在傳遞的時候如果沒有指定ref,則傳遞的是記憶體中的一分副本,而class則是傳遞對他的引用。
b)    類在堆中,結構在棧中,類傳遞的是類在堆中的地址,而結構是在棧中另複製了一個傳遞,你改變傳遞過來的結構不會影響原結構。而類是引用,共用一塊記憶體,會改變堆中類的內容。
c)    對於結構,不像類那樣存在繼承。一個結構不能從另一個結構或類繼承,而且不能作為一個類的基。但是,結構從基類 Object 繼承。 

3.new關鍵字的作用:

a)     作為運算子用來建立一個對象和調用建構函式。
b)     作為修飾符。
c)      用於在泛型聲明中約束可能用作型別參數的參數的類型。

new作為修飾符的作用,在用作修飾符時,new關鍵字可以在衍生類別中隱藏基類的方法,也就說在使用衍生類別的方法是調用的方法是New關鍵字新定義出來的方法,而不是基類的方法。在不使用New關鍵字來隱藏基類方法也是可以的,編譯器會出現一個警告,提示如果有意去隱藏基類的方法,請使用New關鍵字修飾。

4.override和overload區別:

Item Override重寫(覆蓋) Overload重載
位置 存在於繼承關係的類中 存在於同一類中
方法名 相同 相同
參數列表 相同 必須不同
傳回值 相同 可以不

 

5.實值型別和參考型別的區別:
聲明一個實值型別變數,編譯器會在棧上分配一個空間,這個空間對應著該實值型別變數,空間裡儲存的就是該變數的值。參考型別的執行個體分配在堆上,建立一個參考型別執行個體,得到的變數值對應的是該執行個體的記憶體配置地址。實值型別的值是存放在堆棧中的,改變其值,不改變變數原有的值,而參考型別的值是存放在棧中的,其引用的地址是存放在堆棧中的,改變其值也就改變了變數原有的值。實值型別不允許包含null值,然而可空類型可以將null賦值給實值型別l。

Item 實值型別 參考型別
記憶體配置地點 分配在棧中 分配在堆中
效率 效率高,不需要地址轉換 效率低,需要進行地址轉換
記憶體回收 使用完後,立即回收 使用完後,不是立即回收,等待GC回收
賦值操作 進行複製,建立一個同值新對象 只是對原有對象的引用
函數參數與傳回值 是對象的複製 是原有對象的引用,並不產生新的對象
類型擴充 不易擴充 容易擴充,方便與類型擴充

6.死結的必要條件?如何避免?
1) 互斥條件:一個資源每次只能被一個進程使用。
2) 請求與保持條件:一個進程因請求資源而阻塞時,對已獲得的資源保持不放。
3) 不剝奪條件:進程已獲得的資源,在末使用完之前,不能強行剝奪。
4) 迴圈等待條件:若干進程之間形成一種頭尾相接的迴圈等待資源關係。
這四個條件是死結的必要條件,只要系統發生死結,這些條件必然成立,而只要上述條件之一不滿足,就不會發生死結。
死結排除的方法:
1)、撤消陷於死結的全部進程;
2)、逐個撤消陷於死結的進程,直到死結不存在;
3)、從陷於死結的進程中逐個強迫放棄所佔用的資源,直至死結消失。
4)、從另外一些進程那裡強行剝奪足夠數量的資源分派給死結進程,以解除死結狀態

7.base、this關鍵字的含義?
1)base 關鍵字用於從衍生類別中訪問基類的成員: 
調用基類上已被其他方法重寫的方法。 
指定建立衍生類別執行個體時應調用的基類建構函式。 
基類訪問只能在建構函式、執行個體方法或執行個體屬性訪問器中進行。
2)this 關鍵字引用類的當前執行個體。 new class()
以下是 this 的常用用途:
限定被相似的名稱隱藏的成員  public new
將對象作為參數傳遞到其他方法 
聲明索引器。

8.抽象類別和介面的異同?
1)抽象類別:抽象類別是特殊的類,只是不能被執行個體化;除此以外,具有類的其他特性;重要的是抽象類別可以包括抽象方法,這是普通類所不能的。抽象方法只能聲明於抽象類別中,且不包含任何實現,衍生類別必須覆蓋它們。另外,抽象類別可以派生自一個抽象類別,可以覆蓋基類的抽象方法也可以不覆蓋,如果不覆蓋,則其衍生類別必須覆蓋它們。
2)介面是參考型別的,和抽象類別的相似之處有三點:
       a、不能執行個體化;
       b、包含未實現的方法聲明;
       c、衍生類別必須實現未實現的方法,抽象類別是抽象方法,介面則是所有成員(不僅是方法包括其他成員);
       d、介面除了可以包含方法之外,還可以包含屬性、索引器、事件,而且這些成員都被定義為公有的。除此之外,不能包含任何其他的成員,例如:常量、域、建構函式、解構函式、靜態成員。一個類可以直接繼承多個介面,但只能直接繼承一個類(包括抽象類別)。
3)區別:
     a、抽象類別更多的是定義在一系列緊密相關的類間,而介面大多數是關係疏鬆但都實現某一功能的類中;
     b、一個類一次可以實現若干個介面,但是只能擴充一個父類;
     c、介面可以用於支援回調,而繼承並不具備這個特點;
     d、抽象類別不能被密封;
     e、抽象類別實現的具體方法預設為虛的,但實現介面的類中的介面方法卻預設為非虛的,當然您也可以聲明為虛的。
     f、抽象類別實現了oop中的一個原則,把可變的與不可變的分離。抽象類別和介面就是定義為不可變的,而把可變的座位子類去實現;
     g、好的介面定義應該是具有專一功能性的,而不是多功能的,否則造成介面汙染。如果一個類只是實現了這個介面的中一個功能,而不得不去實現介面中的其他方法,就叫介面汙染;
     h、盡量避免使用繼承來實現組建功能,而是使用黑箱複用,即對象組合。因為繼承的層次增多,造成最直接的後果就是當你調用這個類群中某一類,就必須把他們全部載入到棧中!後果可想而知.(結合堆棧原理理解)。同時,有心的朋友可以留意到微軟在構建一個類時,很多時候用到了對象組合的方法。比如asp.net中,Page類,有Server Request等屬性,但其實他們都是某個類的對象。使用Page類的這個對象來調用另外的類的方法和屬性,這個是非常基本的一個設計原則。   
     i、如果抽象類別實現介面,則可以把介面中方法映射到抽象類別中作為抽象方法而不必實現,而在抽象類別的子類中實現介面中方法。

9.靜態成員和非靜態成員:
     1)類的成員要麼是靜態,要麼是動態,如果將類的某個成員聲明為static,則該成員是靜態成員;
     2)類的靜態成員是屬於類所有,不必產生類的執行個體就可以訪問它,就是只用類名就可以訪問;
     3)靜態成員為類的所有執行個體所共用,無論這個類建立了多少個執行個體,一個靜態成員在記憶體中只佔有一塊地區;
     4)類的非靜態成員屬於類的執行個體所有,每建立一個類的執行個體,都在記憶體中為非靜態成員開闢了一塊地區;

     5)靜態方法只能訪問類例的靜態欄位,而非靜態方法可以訪問類例的所有欄位;

10.靜態類:

它們僅包含靜態成員。
它們不能被執行個體化。
它們是密封的。
它們不能包含執行個體建構函式(C# 編程指南)。
因此建立靜態類與建立僅包含靜態成員和私人建構函式的類大致一樣。私人建構函式阻止類被執行個體化。
使用靜態類的優點在於,編譯器能夠執行檢查以確保不致偶然地添加執行個體成員。編譯器將保證不會建立此類的實利。
靜態類是密封的,因此不可被繼承。靜態類不能包含建構函式,但仍可聲明靜態建構函式以分配初始值或設定某個靜態狀態。

11.collection和collections的區別:
Collection是集合類的上級介面,Collections是針對集合類的一個協助類,它提供一系列靜態方法來實現對各種集合的搜尋,排序,安全執行緒化操作。

12.堆和棧的區別:
Heap是堆,空間是由手動操作分配和釋放的,它的儲存區很大的自由儲存區。
Stack是棧,是由是作業系統自動分配和釋放的,棧上的空間是有限的。程式在編譯期間變數和函數分配記憶體都是在棧上進行的,且在運行時函數調用時的參數的傳遞也是在棧上進行的。

13.readonly 關鍵字與 const 關鍵字:
const 欄位只能在該欄位的聲明中初始化。
readonly 欄位可以在聲明或建構函式中初始化。因此,根據所使用的建構函式,readonly 欄位可能具有不同的值。
const 欄位是編譯時間常數,而 readonly 欄位可用於運行時常數。
const 預設就是靜態,而 readonly 如果設定成靜態就必須顯示聲明。
const 對於參考型別的常數,可能的值只能是 string 和 null。readonly可以是任何類型

14.進程和線程:
進程是比線程大的程式運行單元,都是由作業系統所體會的系統運行單元,一個程式中至少要有一個進程,有一個進程中,至少要有一個線程,線程的劃分尺度要比進程要小,進程擁有獨立的記憶體單元,線程是共用記憶體,從而極大的提高了程式的運行效率同一個進程中的多個線程可以並發執行。

15.什麼叫應用程式定義域?什麼是Managed 程式碼?什麼是強型別系統?什麼是裝箱和拆箱?什麼是重載?CTS、CLS和CLR分別作何解釋?
     應用程式定義域:就是為安全性,可靠性,隔離性,和版本控制,及卸載程式提供的隔離邊界。它通常由運行庫宿主建立,應用程式定義域提供了一個更安全,用途更廣的處理單元。

  Managed 程式碼:使用CLR編譯語言編輯器開發編寫的代碼就叫Managed 程式碼。

  裝箱和拆箱:是把實值型別轉換為參考型別的過程,是隱式的,相反的過程就是拆箱,是顯式的。

  CTS是公用類型系統,CLS是Common Language Specification,CLR公用語言運行庫。

  強型別系統:每個變數和對象都必須具有申明類型。

16.c#中類的預設存取修飾詞,是private還是internal?

 預設是internal :
  C#用多種修飾符來表達類的不同性質。根據其保護級C#的類有五種不同的限制修飾符:
public可以被任意存取;
protected只可以被本類和其繼承子類存取;
internal只可以被本組合體(Assembly)內所有的類存取,組合體是C#語言中類被組合後的邏輯單位和物理單位,其編譯後的副檔名往往是“.DLL”或“.EXE”。
protected internal唯一的一種組合限制修飾符,它只可以被本組合體內所有的類和這些類的繼承子類所存取。
private只可以被本類所存取。
如果不是嵌套的類,命名空間或編譯單元內的類只有public和internal兩種修飾。

new修飾符只能用於嵌套的類,表示對繼承父類同名類型的隱藏。

abstract用來修飾抽象類別,表示該類只能作為父類被用於繼承,而不能進行對象執行個體化。抽象類別可以包含抽象的成員,但這並非必須。abstract不能和new同時用。下面是抽象類別用法的偽碼:

abstract class A
{
public abstract void F();
}
abstract class B: A
{
public void G() {}
}
class C: B
{
public override void F()
{
//方法F的實現
}
}

抽象類別A內含一個抽象方法F(),它不能被執行個體化。類B繼承自類A,其內包含了一個執行個體方法G(),但並沒有實現抽象方法F(),所以仍然必須聲明為抽象類別。類C繼承自類B,實作類別抽象方法F(),於是可以進行對象執行個體化。

sealed用來修飾類為密封類,阻止該類被繼承。同時對一個類作abstract和sealed的修飾是沒有意義的,也是被禁止的。 

17.c# 類的public private internal protected的區別:
public 修飾的類,可以在整個系統的任意地方調用,是完全公開的;
private 相反的,只能在類內部調用.任何執行個體,無法調用private調用;
internal 僅為同項目(這裡的項目是只單獨的項目,而不是整個解決方案)調用,或者說同一命名空間內調用;
protected   自己及自己的子類可以調用

18.error和exception
Error和Exception都繼承自Throwable,他們下列不同處:
Exceptions
1.可以是 可被控制(checked) 或 不可控制的(unchecked)
2.表示一個由程式員導致的錯誤
3.應該在應用程式級被處理
Errors
1.總是 不可控制的(unchecked)
2.經常用來用於表示系統錯誤或低層資源的錯誤
3.如何可能的話,應該在系統級被捕捉 

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.