下文是125個基本的C#面試問答清單。這些面試問題簡單、直接了當,涵蓋了C#最基本的概念,大部分和物件導向的概念相關。所以如果你在準備C#面試,我建議你必須掌握這125個基本的C#面試問答來複習你的C#概念。那麼現在來看看這125個基本的C#面試問答清單吧。
1. 什麼是C#?
C#(發音”C sharp”)是一種簡單、有別於傳統的、物件導向、型別安全的程式設計語言。C和C++程式員很快就會熟悉它。C#中結合了高生產率的快速應用開發(RAD)語言。
2. C#的有哪些注釋類型?
C#中有三種注釋類型。
單行(//)
多行(/* */)
Page/XML 注釋(///)。
3. C#.NET中使用的命名空間有哪些?
命名空間是類型的邏輯分組。
using System;
using System.Collections.Generic;
using System.Windows.Forms;
4. C#有哪些特點?
C#有以下特點:
簡單
型別安全
靈活
物件導向
相容
持久化
互通性
有別於傳統
5. 繼承有哪些不同的類別?
在物件導向編程中繼承的四種類型:
單繼承:包括一個基類和一個衍生類別。
多層繼承(Hierarchical inheritance) :包括一個基類和繼承自同一個基類的衍生類別。
多級繼承(Multilevel inheritance):包括從一個衍生類別派生出來的類。
多重繼承(Multiple inheritance):包括多個基類和一個衍生類別。
6. 物件導向編程的基本概念是什嗎?
有必要理解一些在物件導向編程中廣泛使用的概念。它們包括:
對象
類
資料抽象和封裝
繼承
多態性
動態綁定
資訊傳遞。
7. 你可以繼承多個介面嗎?
可以的。在C#中可能繼承多個介面。
8. 什麼是繼承?
繼承是從一個已經存在的類中派生出來的新類。
9. Define scope?定義範圍?
範圍指的是代碼中一個變數可以被訪問的地區。
10. public、static和void之間的區別是什嗎?
public:關鍵字public是存取修飾詞,用來告訴C#編譯器主(Main)方法可以被任何人調用。
static:關鍵字static表明主(Main)方法是一個全域方法,不需要穿件類執行個體即可訪問。編譯器儲存該方法的地址作為切入點,並利用這個資訊在任何對象建立之前開始執行它。
void:關鍵字void是一個類型修飾符表明主(Main)方法不返回任何值。
11. C#中的修飾符有哪些?
Abstract
Sealed
Virtual
Const
Event
Extern
Override
Readonly
Static
New
12. C#中存取修飾詞的種類有哪些?
C#中的存取修飾詞是:
public
protect
private
internal
internal protect
13. 什麼是裝箱和拆箱?
變數實值型別隱式轉換為參考型別成為裝箱,例如integer到object的類型轉換。
參考型別變數轉換回實值型別成為拆箱。
14. 對象是什嗎?
對象是類的執行個體。對象的建立使用new操作。一個類在記憶體中建立一個對象,將包含特定對象的值和行為(或者方法)的資訊。
15. C#中有哪些類型的數組?
一維數組(Single-Dimensional)
多維陣列(Multidimensional)
交錯數組(Jagged arrays)。
16. 對象和執行個體之間的區別是什嗎?
使用者定義的類型的執行個體稱為一個對象。我們可以從一個類執行個體化很多個物件。
對象是類的執行個體。
17. Define destructors?定義解構函式?
當類對象超出範圍或者被明確刪除的時候,解構函式被調用。解構函式,顧名思義是用來銷毀由建構函式建立的對象的。正如建構函式,解構函式是一個類成員方法,方法名和類名相同,只是由波浪號開頭。
18. 列舉資料型別怎麼用?
枚舉類型是另一種使用者定義型別,它提供了一種串連名字為數位方式,從而提高了代碼的可理解性。enum關鍵字自動地枚舉一組詞,賦予它們的值為0,1,2並以此類推。
19. 定義建構函式?
建構函式是和它的類同名的成員方法。每當建立其關聯的類的對象時建構函式都會被調用。它之所以被稱為建構函式是因為它構造了類的資料成員的值。
20. 什麼是封裝?
封裝資料和功能成為一個單元(稱為類)就被稱為封裝。封裝包含並且隱藏對象資訊,例如內部資料結構和代碼。
21. C#支援多重繼承嗎?
不支援,它不可能。支援多級繼承。
22. 什麼是ENUM?
Enum用於定義常量。
23. 資料集是什嗎?
資料集(DataSet)是從任何資料來源載入資料的記憶體表示。
24. private和public關鍵字的區別是什嗎?
Private:關鍵字private是預設存取層級,並且在所有其他存取層級中是最嚴格的。它給予一個類型或者類型成員最小的許可權。私人成員僅僅在聲明其的類體中可以被訪問。
Public:關鍵字public是所有存取層級中最自由地,沒有任何訪問限制。公用成員的訪問不僅可以來自外部,也可以來自內部,並且可以自由訪問定義在類體內或者體外的任何成員。
25. 定義多態性?
多態性意味著一個名字,多種形式。它使我們在一個程式中可以定義一個以上相同名字的方法。它讓我們重載操作以便這樣的操作可以對不同的執行個體表現不同的行為。
26. 什麼是交錯數組?
交錯數組是元素為數組的數組。
交錯數組元素的維度和大小可以不同。
交錯數組有時稱為“數組的數組”。
27. 什麼是抽象基類?
抽象類別是被設計為專門用於作為基類的類。抽象類別至少還有一個純虛方法。
28. 方法重寫和方法重載有什麼區別?
當重寫一個方法時,你改變了衍生類別中方法的行為。重載方法只涉及在類中另一個同名的方法。
29. ref和out參數之間的區別是什嗎?
傳遞給ref參數的參數必須先初始化。與此相比,對out參數來說,在參數傳遞給out參數之前不需要顯示初始化。
30. C#中using語句怎麼用?
using語句通常是擷取資源,執行語句,然後釋放該資源。
31. 什麼是序列化?
序列化(Serialization)是將對象轉換為位元組流的過程。
還原序列化(De-serialization)是從位元組流建立對象這樣相反的過程。
序列化/還原序列化常用於傳遞對象。
32. 結構和類之間有什麼區別?
結構是實值型別,類是參考型別。
結構不能有建構函式和解構函式。
類可以同時有建構函式和解構函式。
結構不支援繼承,而類支援繼承。
33. 類和介面之間有什麼區別?
類(Class)是對象的邏輯表示。它是資料集合和相關子過程的定義。
介面(Interface)也是一個類,包含沒有任何方法體定義的方法。類不支援多重繼承,但是介面支援。
34. 什麼是委託?
委託是型別安全,物件導向的函數指標的實現,並且在許多一個組件需要回調到使用它的組件這樣的情況下使用。
35. 什麼是認證與授權?
認證是識別使用者的過程。認證是以認證(使用者名稱和密碼)來識別/驗證使用者。
授權在認證之後執行。授權是一個基於這些使用者身份授予存取權限的過程。
授權允許使用者對特定資源的訪問。
36. 什麼是基類?
類聲明可以通過類名加一個冒號和基類名來指定基類。省略基類說明等同於從object類派生。
37. “this”可以在靜態方法中用嗎?
不,‘This’不能在靜態方法中使用。僅僅只有靜態變數/方法可以在靜態方法中使用。
38. constants、readonly和static之間的區別是什嗎?
Constants: 值不能變。
Read-only: 值在類的建構函式中僅僅初始化一次。
Static: 值可以被初始化一次。
39. C#中支援哪些語句類型?
C#支援的幾種不同的語句類型是
塊語句
聲明語句
運算式語句
選擇語句
迭代語句
跳躍陳述式
異常處理語句
檢查和未檢查
Lock語句
40. 什麼是介面類?
它是一個抽象類別,所有公用抽象方法必須要在其繼承類中實現。
41. 什麼是實值型別和參考型別?
實值型別儲存在堆棧中。
例如: bool, byte, chat, decimal, double, enum, float, int, long, sbyte, short, strut, uint, ulong, ushort。
參考型別儲存在託管堆中。
例如: class, delegate, interface, object, string。
42. 關鍵字string和System.String類之間有什麼區別?
關鍵字string是System.String類的別名。所以,System.String和關鍵字string是一樣的,你可以使用任何你喜歡的命名規範。String類提供了許多方法用於安全建立,操作和比較字串。
43. C#中提供的兩種資料類型是什嗎?
實值型別
參考型別
44. 有哪些緩衝的種類?
有三種類型的緩衝:
輸出緩衝(Output Caching):儲存asp.net頁面的應答資訊。
片段快取(Fragment Caching):僅緩衝/儲存部分頁面內容(使用者控制)。
資料緩衝(Data Caching):為了效能通過編程的方式來緩衝對象。
45. 自訂控制項和使用者控制項之間的區別是什嗎?
自訂控制項是編譯後的代碼(Dlls),容易使用,建立困難,可以放在工具箱。拖拉使用的控制項。
屬性可以直觀地在設計時指定。可以被多個應用程式使用(如果共用Dlls),即使是私人的也能拷貝到web應用程式的bin目錄,添加引用和使用。通常是用來為獨立的消費應用程式提供公用功能。
使用者控制項和ASP的include檔案,輕鬆建立,不能放置在箱中來拖拉放置它。使用者控制項在單個應用程式檔案之間共用。
46. 什麼是方法?
方法是由對象或者類執行來實現計算或者操作的成員。靜態方法通過類訪問。執行個體方法通過類的執行個體來訪問。
47. 什麼是域?
域是類或者類的執行個體相關的變數。
48. 什麼是事件?
事件是使一個類或對象能夠提供通知的成員。事件聲明像域聲明一樣,除了聲明包含event關鍵字並且類型必須為委託類型。
49.什麼是文本和它們的類型?
文本是程式分配給變數的值常量。C#支援的幾種文本類型是
整數(Integer literals)
實數(Real literals)
布爾值(Boolean literals)
單字元(Single character literals)
字串(String literals)
反斜線(Backslash character literals)
50. 實值型別和參考型別的區別是什嗎?
實值型別儲存在堆棧上,是一個變數的值賦值給另一個變數。
參考型別儲存在託管堆上,是兩個引用變數之間的發生賦值。
51. C#有什麼特性?
C#是一個簡單而強大的程式設計語言,用於編寫企業版的應用程式。
它是C++和VB的混合體。它保留了許多C++特性,如語句,運算式和運算子並結合了VB的生產力。
C#協助開發人員輕易地構建網路服務,能夠通過任何語言,任何平台來訪問Internet。
C#協助開發人員用更少的程式碼完成開發,從而在代碼中錯誤更少。
C#引入了相當大的改進和創新,如型別安全,版本控制,事件和垃圾收集這些領域。
52. 錯誤的類型是什嗎?
語法錯誤(Syntax error)
邏輯錯誤(Logic error)
執行階段錯誤(Runtime error)
53. break和continue語句之間有什麼區別?
break語句是用來終止當前封閉迴圈或者它所在的條件陳述式的。我們已經使用break語句跳出switch語句。
continue語句是用來改變執行順序的。和break語句那樣跳出迴圈相反,continue語句停止當前迭代並且只將控制返回到迴圈頂部。
54. 定義命名空間?
命名空間被稱為容器,用來組織分層的.NET類。
55. 什麼是程式碼群組?
程式碼群組是一組共用安全內容相關的套件。
56. C#中什麼是密封類?
sealed修飾符用來阻止從一個類派生。如果一個密封類被指定為另一個類的基類時會發生編譯時間錯誤。
57. 靜態方法和執行個體方法的區別是什嗎?
以static修飾符聲明的方法是靜態方法。靜態方法不操作具體的執行個體,並且只能被靜態成員訪問。
沒有以static修飾符聲明的方法是執行個體方法。執行個體方法操作一個具體的執行個體並且可以被靜態和執行個體成員訪問。在其上調用執行個體方法的執行個體可以像這樣顯示訪問。在靜態方法中這麼調用是錯誤的。
58. C#中有哪些變數的類型?
C#中不同的變數類型是:
靜態變數(static variables)
執行個體變數(instance variable)
值參數(value parameters)
引用參數(reference parameters)
數組元素(array elements)
輸出參數(output parameters)
局部變數(local variables)
59. 方法重載是什麼意思?
方法重載允許在同一個類中的多個方法有相同的名字,只要它們具有獨特的簽名。當編譯一個重載方法的調用時,編譯器使用重載決策決定具體調用的方法。
60. 什麼是參數?
參數是用來傳遞值或者變數引用給方法的。方法的參數從被呼叫者法時指定的參數得到它們實際的值。有四種參數:值參數,引用參數,輸出參數和參數數組。
61. C#是物件導向的語言嗎?
是的,C#和傳統的Java及C++一樣是物件導向的語言。
62. Array和Arraylist之間的區別是什嗎?
數組是相同類型的集合。數組大小在它聲明的時候就固定了。鏈表和數組相似,但它沒有固定的大小。
63. C#中有什麼特殊的運算子?
C#支援一下特殊運算子。
is (關係運算子)
as (關係運算子)
typeof (類型運算子)
sizeof (大小運算子,用於擷取非託管類的大小)
new (對象運算子)
.dot (成員訪問運算子)
checked (溢出檢查)
unchecked?(防止溢出檢查)
64. C#中運算子的含義是什嗎?
運算子是界定了對類執行個體應用特定的運算運算式內涵的成員。可以定義三種類型的運算子:一元運算子,二元運算子和轉換運算子。所有的運算子必須聲明為public和static的。
65. 什麼是型別參數化?
型別參數化是一個類型在另一個值或者類型之上參數化。
66. 抽象類別的特性是什嗎?
抽象類別不能被實力化,在抽象類別上使用new操作符是錯誤的。
抽象類別允許(但不必要)包含抽象方法和入口。
抽象類別不能用scaled修飾符。
67. abstract關鍵字怎麼用?
修飾符abstract是用於類的關鍵字,以表明這個類本身不能直接有執行個體或者對象,並且對於其他類來說它只能是一個“基類”。
68. goto語句怎麼用?
goto語句仍然包含在C#語言中。這個goto可以用來從一個迴圈內部跳轉到外部。但是從迴圈外部跳入迴圈內是不允許的。
69. 控制台應用程式和視窗應用程式有什麼區別?
控制台應用程式,設計用來在沒有使用者介面的命令列中運行。
視窗應用程式,設計用來通過使用者介面在使用者案頭執行。
70. return語句怎麼用?
return語句與程式 (方法或者函數)相關。在執行return語句的時候,系統將控制權從被調用程式交給調用程式。return語句用於兩種目的:
立即返回當前執行的代碼的調用者
返回給當前執行的代碼的調用者一些值。
71. Array和LinkedList之間的區別是什嗎?
數組是不關心彼此元素位置的簡單數字序列。他們之間的位置彼此獨立。增加,刪除或者修改任何數組元素都是非常容易的。相對於數組,鏈表是一個複雜的數字序列。
72. C#有throws子句嗎?
不,不像Java,C#不需要開發人員指定方法可以拋出的異常。
73. C#支援可變數目的參數嗎?
是的,使用params關鍵字。該參數指定為特定類型的參數列表。
74. 可以重寫私人虛方法嗎?
不可以,私人方法不能在類外訪問。
75. 什麼是多播委託?
每個委派物件保持對一個單獨方法的引用。但是,一個委派物件保持對多個方法的引用並調用它們是可能的。這樣的委派物件成為多播委託或者組合委託。
76. 什麼是C#專屬的特性?
XML文檔.
77. 在C#中使用異常是推薦的嗎?
是的,在.NET架構中異常是推薦的錯誤處理機制。
78. 在switch語句中break語句是做什麼的?
break語句終結它所在的迴圈。它也改變了程式執行的流程。
在switch語句中,break語句用在一個case語句的結尾處。在C#中break語句是強制性的,避免了一個case語句流向另一個case語句。
79. Is C# object oriented?C#是物件導向的嗎?
是的,C#和傳統的Java及C++一樣是物件導向的語言。
80. 什麼是智能導航?
因為服務端驗證和頁面被重新整理導致頁面重新整理時,游標位置保持不變。
81. CONST和READONLY的區別是什嗎?
都是為了定義常量值。const欄位只能在聲明這個域的時候初始化。readonly欄位可以在聲明時或者建構函式中定義。
82. C#有throws子句嗎?
不,不像Java,C#不需要(甚至不允許)開發人員指定方法可以拋出的異常。
83. 方法可以重載的不同方式是什嗎?
不同的參數類型,不同的參數個數,不同的參數順序。
84. 事件有傳回值嗎?
沒有,事件沒有傳回型別。
85. 事件是什嗎?
事件是一個基於另一個程式方法執行的動作。
事件是被對象或者類使用來通知其他對象發生的事件的委託類型類成員。
事件可以通過event關鍵字來聲明。
86. 什麼是標識符?
標識符無他,它是用來在程式中唯一識別各種實體的名稱。
87. C#中有哪些不同的文本類型?
布爾值: True和False是Boolean類型,分別映射到真和假的狀態。
整數:用於編寫類型Int,uInt,long和ulong的值。
實數:用於編寫類型float, double和decimal的值。
字元:代表單字元,通常由有引號的字元組成,如‘a’。
字串: C#支援兩種類型的字串,規則字串和原義字串。規則字串由0個或多個括在雙引號中的字元組成,如“116110″。原義字串由@字元後跟帶雙引號的字元組成,如@”hello”。
Null: 代表null類型。
88. 什麼是資料封裝?
資料封裝,也被稱為資料隱藏,它是類的實現細節對保持對使用者隱匿的機制。使用者只能通過執行稱為方法的特殊函數來對隱藏了成員的類執行一組有限的操作。
89. 可以重寫私人虛方法嗎?
不可以,私人方法不能在類外訪問。
90. 子程式和函數的主要區別是什嗎?
子程式沒有傳回值,而函數有。
91. C#和C++的區別是什嗎?
C#不支援#include語句。它只用using語句。
C#中,類定義在最後不使用分號。
C#不支援多重繼承。
資料類型的顯示轉換在C#中比C++中安全很多。
C#中switch也可用於字串值。
命令列參數數組的行為在C#中和C++中不一樣。
92. 什麼是嵌套類?
嵌套類是類中的類。
嵌套類是聲明發生在另一個類或者介面裡面的任何類。
93. 可以給靜態建構函式參數嗎?
不可以,靜態建構函式不可以有參數。
94. C#中,字串是實值型別還是參考型別?
字串是對象(參考型別)。
95. C#提供拷貝建構函式嗎?
不,C#不提供拷貝建構函式。
96. 類或者結構可以有多個建構函式嗎?
可以,類或者結構可以有多個建構函式。C#中建構函式可以被重載。
97. 可以建立介面的執行個體嗎?
不可以,你不可以建立介面的執行個體。
98. 介面可以包含欄位嗎?
不可以,介面不能包含欄位。
99. 類可以有靜態建構函式嗎?
是的,類可以有靜態建構函式。靜態建構函式在任何靜態欄位被訪問之前被立即自動調用,並且通常用來初始化靜態類成員。它在第一個執行個體被建立或者任何靜態成員被引用之前自動調用。靜態建構函式在執行個體建構函式之前調用。一個例子如下所示。
100. C#中委託的主要作用是什嗎?
委託主要用於定義回調方法。
101. 投影(Shadowing)和重寫(overriding)的區別是什嗎?
重寫僅僅重定義實現而投影重定義整個元素。
重寫衍生類別可以通過“ME”關鍵字引用父類元素,但投影中你可以通過”MYBASE”訪問父類元素。
102. 事件可以用存取修飾詞嗎?
可以,你可以在事件中用存取修飾詞。你可以對事件使用portected關鍵字,這樣只允許繼承類訪問。你可以使用private修飾事件,僅可以供當前類對象訪問。
103. 為什麼在代碼中用virtual關鍵字?
代碼中Virtual關鍵字是用來定義可以在衍生類別中重寫的方法和屬性的。
104. 什麼是建構函式和解構函式?
建構函式和解構函式是特殊的方法。
建構函式和解構函式是每個類的特殊方法。
每個類都有自己的建構函式和解構函式,並且在類執行個體被建立或者銷毀時自動調用。
每當你訪問類的時候,建構函式就初始化所有類成員。當對象不想再需要的時候,解構函式就銷毀它們。
105. 我們怎麼抑制finalize方法?
GC.SuppressFinalize()。
106. C#支援可變數目的參數嗎?
是的,使用params關鍵字。
該參數指定為特定類型的參數列表,例如,int。為了最大的靈活性,類型可以是object。
使用這種方法的標準例子是System.console.writeLine()。
107. 哪個方法用來啟動一個線程?
Start。
108. 什麼是泛型?
泛型協助我們建立靈活的強型別集合。
泛型基本上從資料類型中分離了邏輯,以保持更好的可重用性,更好的可維護性等等。
109. 有哪些不同種類的多態性?
有兩種類型的多態,它們是:
編譯時間多態性
運行時多態性
110. 編譯時間多態性和運行時多態性的區別是什嗎?
編譯時間多態性
編譯時間多態性也被稱為方法重載。
方法重載是指有兩個或更多同名但含有不同簽名的方法。
運行時多態性
運行時多態性也被稱為方法重寫。
方法重寫是指有兩個或更多的同名方法,含有相同的方法簽名但對應不同的實現。
111. 哪一個命名空間使XML中多線程編程可行?
System.Threading。
112. 在C#中可以聲明一個靜態塊嗎?
不可以,因為C#不支援靜態塊,但它支援靜態方法。
113. 方法可以聲明為密封(sealed)嗎?
在C#中方法不可以聲明為sealed。但當我們在衍生類別重寫一個方法的時候,我們可以將重寫的方法定義為sealed。通過其sealed,我們就可以避免對該方法的進一步重寫。
114. 在C#中用什麼命令來實現屬性?
C#中用get和set修飾符來實現屬性。
115. 什麼是靜態成員?
定義為靜態成員,可以從類層級上直接調用,而不是從類執行個體上調用。
116. C#中繼承一個類的文法是什嗎?
當一個類從另一個類派生時,基類的成員就變為派生的成員。
在訪問基類的成員所使用的存取修飾詞指定了衍生類別中的基類成員的訪問狀態。
C#中從另一個類繼承類的文法如下:
class MyNewClass : MyBaseClass
117. C#中while迴圈和do while迴圈的基本區別是什嗎?
while迴圈在一開始測試它的條件,這意味著如果條件求值為真,封閉的語句塊執行0或者更多次。do while迴圈至少遍曆一次語句塊然後在最後才檢查條件。
118. 子程式和函數的主要區別是什嗎?
子程式沒有傳回值,而函數有。
119. C#中什麼是密封類?
sealed修飾符用來阻止從一個類派生。如果一個密封類被指定為另一個類的基類時會發生編譯時間錯誤。
120.類和介面的區別是什嗎?
抽象類別可以實現它的一些成員,但介面不能實現它的任何成員。
介面不能有欄位,而抽象類別可以有欄位。
介面僅可以從另一個介面繼承並且不能繼承抽象類別,而抽象類別可以繼承另一個抽象類別或另一個介面。
類可以同時繼承多個介面,而類不能同時繼承多個類。
抽象類別的成員可以定義存取修飾詞而介面成員不能定義存取修飾詞。
121. 抽象方法和虛方法之間的區別是什嗎?
抽象方法不提供實現,並且強制衍生類別重寫該方法(除非衍生類別也是個抽象類別),而虛方法可以有實現並且在衍生類別中重寫與否是可選的。因此虛方法可以實現並提供了衍生類別重寫的選擇。抽象方法不能提供實現並且強制衍生類別重寫該方法。
122. 什麼是靜態方法?
只要方法不試圖訪問任何執行個體資料或者其他執行個體方法,那麼聲明它為靜態是可能的。
123. 什麼是New修飾符?
new修飾符隱藏了基類的成員。C#僅僅支援簽名的隱藏。
124. C#中get和set屬性的優勢是什嗎?
get屬性訪問器用於返回屬性值。
set屬性訪問器用來設定新的值。
125. const和readonly之間有什麼區別?
const聲明的欄位不能使用static修飾符,而readonly可以使用static修飾符。
const欄位只能在聲明時初始化,而readonly可以在聲明時或在建構函式中初始化。
const欄位的值在設計時就計算出來了,而readonly的值在運行時計算。