C#基礎概念面試題

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)
{
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章