125個基本的C#面試問答

EluQ發表於2014-08-01

下文是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. publicstaticvoid之間的區別是什麼?

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. privatepublic關鍵字的區別是什麼?

Private:關鍵字private是預設訪問級別,並且在所有其他訪問級別中是最嚴格的。它給予一個型別或者型別成員最小的許可權。私有成員僅僅在宣告其的類體中可以被訪問。

Public:關鍵字public是所有訪問級別中最自由地,沒有任何訪問限制。公共成員的訪問不僅可以來自外部,也可以來自內部,並且可以自由訪問定義在類體內或者體外的任何成員。

25. 定義多型性?

多型性意味著一個名字,多種形式。它使我們在一個程式中可以定義一個以上相同名字的方法。它讓我們過載操作以便這樣的操作可以對不同的例項表現不同的行為。

26. 什麼是交錯陣列?

交錯陣列是元素為陣列的陣列。

交錯陣列元素的維度和大小可以不同。

交錯陣列有時稱為“陣列的陣列”。

27. 什麼是抽象基類?

抽象類是被設計為專門用於作為基類的類。抽象類至少還有一個純虛方法。

28. 方法重寫和方法過載有什麼區別?

當重寫一個方法時,你改變了派生類中方法的行為。過載方法只涉及在類中另一個同名的方法。

29. refout引數之間的區別是什麼?

傳遞給ref引數的引數必須先初始化。與此相比,對out引數來說,在引數傳遞給out引數之前不需要顯示初始化。

30. C#using語句怎麼用?

using語句通常是獲取資源,執行語句,然後釋放該資源。

31. 什麼是序列化?

序列化(Serialization)是將物件轉換為位元組流的過程。

反序列化(De-serialization)是從位元組流建立物件這樣相反的過程。

序列化/反序列化常用於傳遞物件。

32. 結構和類之間有什麼區別?

結構是值型別,類是引用型別。

結構不能有建構函式和解構函式。

類可以同時有建構函式和解構函式。

結構不支援繼承,而類支援繼承。

33. 類和介面之間有什麼區別?

(Class)是物件的邏輯表示。它是資料集合和相關子過程的定義。

介面(Interface)也是一個類,包含沒有任何方法體定義的方法。類不支援多重繼承,但是介面支援。

34. 什麼是委託?

委託是型別安全,物件導向的函式指標的實現,並且在許多一個元件需要回撥到使用它的元件這樣的情況下使用。

35. 什麼是認證與授權?

認證是識別使用者的過程。認證是以證照(使用者名稱和密碼)來識別/驗證使用者。

授權在認證之後執行。授權是一個基於這些使用者身份授予訪問許可權的過程。

授權允許使用者對特定資源的訪問。

36. 什麼是基類?

類宣告可以通過類名加一個冒號和基類名來指定基類。省略基類說明等同於從object類派生。

37. “this”可以在靜態方法中用嗎?

不,‘This’不能在靜態方法中使用。僅僅只有靜態變數/方法可以在靜態方法中使用。

38. constantsreadonlystatic之間的區別是什麼?

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. 關鍵字stringSystem.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. breakcontinue語句之間有什麼區別?

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. ArrayArraylist之間的區別是什麼?

陣列是相同型別的集合。陣列大小在它宣告的時候就固定了。連結串列和陣列相似,但它沒有固定的大小。

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. ArrayLinkedList之間的區別是什麼?

陣列是不關心彼此元素位置的簡單數字序列。他們之間的位置彼此獨立。增加,刪除或者修改任何陣列元素都是非常容易的。相對於陣列,連結串列是一個複雜的數字序列。

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. CONSTREADONLY的區別是什麼?

都是為了定義常量值。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#getset屬性的優勢是什麼?

get屬性訪問器用於返回屬性值。

set屬性訪問器用來設定新的值。

125. constreadonly之間有什麼區別?

const宣告的欄位不能使用static修飾符,而readonly可以使用static修飾符。

const欄位只能在宣告時初始化,而readonly可以在宣告時或在建構函式中初始化。

const欄位的值在設計時就計算出來了,而readonly的值在執行時計算。

 

相關文章