C#基礎概念面試題

笨笨鼠→_→發表於2012-07-07
1.什麼是裝箱和拆箱?什麼是過載?什麼是受管制的程式碼?什麼是強型別系統?
CTS、CLS和CLR分別作何解釋?什麼叫應用程式域?
答:裝箱就是把值型別轉成引用型別:裝箱就是把引用型別(包括int與結構這樣的內建型別)轉換為object型別,拆箱就是把object型別轉換為引用型別,裝箱與拆箱實現了,實現了兩種型別的互換;從MS IL角度看好像是boxing,沒記錯的話是把值從堆疊轉到堆中.拆箱相反;
   過載就是指一個方法名同,引數個數不同,返回值可以相同的方法.
   受管制的程式碼:在.NET環境中執行的程式碼都稱為受管制的程式碼(managed code)。.NET外部的其他程式碼也執行在Windows上,這些程式碼稱為示受管制的程式碼(unmanaged code)。
   CTS公共型別系統,.net支援的語言使用相同的資料類,為了實現語言的互操作性,必須有一組各種語言都認可的基本資料型別,這樣才能對所有語言進行標準化處理。還提供了定義定製類的規則。
   CLS公共語言系統,實現多種語言。這是確保程式碼可以在任何語言中訪問的最小標準集體。所有用.NET的編譯器都應支援CLS。CLS構成了可以在.NET和IL中使用的功能子集,程式碼也可以使用CLS外部的功能。如果非CLS功能在程式碼所在裝配件的外部是可見的,那麼這些功能就不能在某些語言中使用。
   CLR公共語言執行時,多種語言程式執行的引擎.它可以處理載入程式、執行程式的程式碼,以及提供所有支援服務的程式碼。
   應用程式域就是程式程式碼的作用範圍,尤其是變數的,託管程式碼是為面向公共語言執行庫的服務編寫的程式碼,變數型別分得比較多,賦值前就知道型別.
2.C#中的介面和類有什麼異同。
答:介面主要是有於互動。它定義一種契約。介面是負責功能的定義,專案中通過介面來規範類,操作類以及抽象類的概念!
   而類是負責功能的具體實現! 類主要是用於複用。
   介面繼承則必須實現屬性和方法,類繼承更多關注是擴充套件和多型.
   介面可由方法、屬性、事件、索引器或這四種成員型別的任何組合構成。介面不能包含欄位。介面成員一定是公共的。
   使用介面的主要目的不是為了去使用多重繼承,而是消除去因為使用抽象類而形成的錯綜複雜的繼承體系. 通過介面定義行為能夠更有效地分離行為與實現,使程式碼更加易於維護。
   介面和類都是類;不同的事,介面只包含方法或屬性的宣告,不包含具體實現方法的程式碼,介面可以實現多繼承,而類只能是單繼承,繼承介面的類必須實現介面中宣告的方法或屬性。介面主要定義一種規範,統一呼叫方法,在大型專案中介面正發揮日益重要的作用。
   在類中也有抽象類的定義;抽象類與介面的區別在於: 抽象類是一個不完全的類,類裡面有抽象的方法,屬性,也可以有具體的方法和屬性,需要進一步的專業化。 但介面是一個行為的規範,裡面的所有東西都是抽象的!
一個類只可以繼承一個基類也就是父類,但可以實現多個介面。
3.程式和執行緒分別怎麼理解和區別?程式與程式的區別?
答:程式是系統進行資源分配和排程的單位;執行緒是CPU排程和分派的單位;
   一個程式可以有多個執行緒,這些執行緒共享這個程式的資源。一個程式內可以有多個執行緒,但是執行緒內不可能有程式。一個程式可以開多執行緒來完成不同或相同的工作。
    程式包含了若干程式,每一個程式包含了一個或多個概念上知執行的執行緒。
    通俗的講:程式是老子,執行緒是兒子,沒有老子就沒有兒子,一個老子可以有多個兒子.一個兒子可以成為別人的兒子,一個老子也可以為別的老子生兒子.
    一般,一個應用程式對應於一個或多個程式,可以把程式看作是該應用程式在作業系統中的標識;而一個程式通常由多個執行緒組成,而執行緒是作業系統為該應用程式分配處理時間的最小單元。
4.如何理解委託?
答:據說相當於函式指標,定義了委託就可以在不呼叫原方法名稱的情況下呼叫那個方法.
   msdn2005中是這樣解釋的,委託具有以下特點:委託類似於 C++ 函式指標,但它是型別安全的、委託允許將方法作為引數進行傳遞、委託可用於定義回撥方法。
委託可以連結在一起;例如,可以對一個事件呼叫多個方法、方法不需要與委託簽名精確匹配。
    有關更多資訊,請參見協變和逆變。C# 2.0 版引入了匿名方法的概念,此類方法允許將程式碼塊作為引數傳遞,以代替單獨定義的方法。
5.概述反射和序列化
答:反射:程式集包含模組,而模組包含型別,型別又包含成員。反射則提供了封裝程式集、模組和型別的物件。您可以使用反射動態地建立型別的例項,將型別繫結到現有物件,或從現有物件中獲取型別。然後,可以呼叫型別的方法或訪問其欄位和屬性
   序列化:序列化是將物件轉換為容易傳輸的格式的過程。例如,可以序列化一個物件,然後使用 HTTP 通過 Internet 在客戶端和伺服器之間傳輸該物件。在另一端,反序列化將從該流重新構造物件。
6.概述o/r mapping 的原理
答:利用反射,配置 將類於資料庫表對映
7.類成員有幾種可訪問形式?簡述可訪問形式修飾符的訪問許可權。
答:可訪問形式有 private、 protected、 public、 internal;
   public(公共的) 完全公開,訪問不受限制。
   protected(保護的) 訪問僅限於包含類或從包含類派生的型別。該類內部和繼承類中可以訪問。
   internal(內部的) 訪問僅限於當前程式集。在同一名稱空間內可以訪問。
   protected internal(內部保護的) 訪問僅限於從包含類派生的當前程式集或型別。
   private(私有的) 訪問僅限於包含型別。在類的內部才可以訪問。
8.用sealed修飾的類有什麼特點
答:sealed(密封的)修飾符用於防止從所修飾的類派生出其它類。如果一個密封類被指定為其他類的基類,則會發生編譯時錯誤。密封類不能同時為抽象類。
   sealed 修飾符主要用於防止非有意的派生,但是它還能促使某些執行時優化。具體說來,由於密封類永遠不會有任何派生類,所以對密封類的例項的虛擬函式成員的呼叫可以轉換為非虛擬呼叫來處理。
9.值型別和引用型別的區別?寫出C#的樣例程式碼。
答:結構是值型別,類是引用型別,所以傳結構就是值型別的應用啦,傳物件或類就是引用型別的。
10.傳入某個屬性的set方法的隱含引數的名稱是什麼?
答:隱含引數的名稱是value,它的型別和屬性所聲名的型別相同。
11.如何在C#中實現繼承?
在類名後加上一個冒號,再加上基類的名稱。
12.物件能否呼叫靜態方法 ?
答:不能。對於類內部定義的靜態變數及靜態方法,該類的物件均不能呼叫。
13.C#支援多重繼承麼?
答:類之間不支援多重繼承,介面之間支援。類對介面叫做實現,不叫繼承。
14.被protected修飾的屬性/方法在何處可以訪問?
答:在繼承或間接繼承與這個類的子類中可以訪問。
15.私有成員會被繼承麼?
答:會,但是不能被訪問。所以看上去他們似乎是不能被繼承的,但實際上確實被繼承了。
16.請描述一下修飾符protected  internal。
答:被protected internal修飾的屬性/方法只能在它的在同一個程式集(Assembly)中的子類被訪問。
正確答案是,在同一個Assembly中,他的訪問級別和public一樣,而跨Assembly訪問時,他的訪問級別同protected一樣。即protected的範圍 + internal的範圍。
8.C#提供一個預設的無引數建構函式,當我實現了另外一個有一個引數的建構函式時候,還想保留這個無引數的建構函式。這樣我應該寫幾個建構函式?
答:兩個,一旦你實現了一個建構函式,C#就不會再提供預設的建構函式了,所以需要手動實現那個無引數建構函式。
17.C#中所有物件共同的基類是什麼?
答:System.Object.
19.在方法定義中,virtual有什麼含意?
答:被virtual修飾的方法可以被子類覆寫。
20.能夠將非靜態的方法覆寫成靜態方法麼?
答:不能,覆寫方法的簽名必須與被覆寫方法的簽名保持一致,除了將virtual改為override。
答案並沒有大錯,只是靜態方法根本無override概念,屬於引起困惑的問題 。
21.可以覆寫私有的虛方法麼?
答:不可以,甚至子類中無法訪問父類中的私有方法。
22.能夠阻止某一個類被其他類繼承麼?
答:可以,使用關鍵字sealed。 還可以將所有建構函式的訪問級別都設為Private或子類無法訪問到的其他級別(Assembly外的iternal),也有同樣的效果。
23.能夠實現允許某個類被繼承,但不允許其中的某個方法被覆寫麼?
答:可以,標記這個類為public,並標記這個方法為sealed。
24.什麼是抽象類(abstract class)?
答:一種不可以被例項化的類。抽象類中一般含有抽象方法,當然也可有具體實現。繼承類只有實現過所有抽象類的抽象方法後才能被例項化。
25.何時必須宣告一個類為抽象類?
答:當這個類中包含抽象方法時,或是該類並沒有完全實現父類的抽象方法時。
26.介面(interface)是什麼?
答:只含有共有抽象方法(public abstract method)的類。這些方法必須在子類中被實現。
27.為什麼不能指定介面中方法的修飾符?
答:介面中的方法用來定義物件之間通訊的契約,指定介面中的方法為私有或保護沒有意義。他們預設為公有方法。
28.那麼如果這些介面中有重複的方法名稱呢?
答:這種情況中你可以決定如何實現。當然需要特別得小心。但是在編譯環節是沒有問題的。
29.介面和抽象類的區別是什麼?
答:介面中所有方法必須是抽象的,並且不能指定方法的訪問修飾符。抽象類中可以有方法的實現,也可以指定方法的訪問修飾符。 還有一個容易被忽視的區別,C#不允許介面帶有靜態成員,儘管這不是.NET的限制。
30.如何區別過載方法?
答:不同的引數型別,不同的引數個數,不同的引數順序。
31.const和readonly有什麼區別?
答:const關鍵字用來宣告編譯時常量,readonly用來宣告執行時常量。
還有一些區別,當應試者提到時你不能說是錯的:作欄位時const隱含靜態,const可以是區域性的,readonly可以在建構函式中初始化等。 
32.System.String 和System.StringBuilder有什麼區別?
答:System.String是不可變的字串。System.StringBuilder存放了一個可變的字串,並提供一些對這個字串修改的方法。
33、在C#中,stringstr=null與stringstr=“”請儘量使用文字或圖象說明其中的區別。
答:stringstr=null是不給他分配記憶體空間,而stringstr=""給它分配長度為空字串的記憶體空間.
回答要點:說明詳細的空間分配。(10分)
34、請詳述在dotnet中類(class)與結構(struct)的異同:
答:Class可以被例項化,屬於引用型別,是分配在記憶體的堆上的,Struct屬於值型別,是分配在記憶體的棧上的.
35.執行下面程式碼後:
String strTemp ="abcdefg 某某某";
Int i System.Text.Encoding.Default.GetBytes(strTemp).Length;
Int j = strTemp.Length;
問:i=(14 ) ;j=(11 )
答:i=(14 ) ;j=(11 ) 中文兩個位元組
37、公司要求開發一個繼承System.Windows.Forms.ListView類的元件,要求達到以下的特殊功能:點選ListView各列列頭時,能按照點選列的每行值進行重排檢視中的所有行(排序的方式如DataGrid相似)。根據您的知識,請簡要談一下您的思路:
答:根據點選的列頭,包該列的ID取出,按照該ID排序後,在給繫結到ListView中
38.Params是什麼含義?
答:Params是C#中的關鍵字,採用此關鍵字可以指定引數數目為可變;在方法宣告中的params關鍵字之後不允許任何其他引數,並且在方法宣告中只允許一個params關鍵字。
如:
public int fConvert(paramsint[]iParas)
{

相關文章