C# - 面試題



尊敬的讀者,這些C# 面試題專為幫助您瞭解在C#主題面試中可能遇到的問題型別而設計。根據我的經驗,優秀的考官在面試期間很少會計劃好要問哪些具體問題,通常問題會從該主題的一些基本概念開始,然後根據進一步的討論和您的回答繼續下去。

C# 是一種現代的、通用的、面向物件的程式語言,由微軟開發。C# 是為公共語言執行時 (CLI) 設計的,它由可執行程式碼和執行時環境組成,允許在不同的計算機平臺和架構上使用各種高階語言。

鋸齒陣列是陣列的陣列。

您可以這樣初始化鋸齒陣列:

int[][] scores = new int[2][]{new int[]{92,93,94},new int[]{85,66,87,88}};

其中,scores 是一個包含兩個整數陣列的陣列 - scores[0] 是一個包含 3 個整數的陣列,scores[1] 是一個包含 4 個整數的陣列。

可以透過三種方式向方法傳遞引數:

  • 值引數 - 此方法將引數的實際值複製到函式的形式引數中。在這種情況下,對函式內部引數所做的更改不會影響引數。

  • 引用引數 - 此方法將引數的記憶體位置的引用複製到形式引數中。這意味著對引數所做的更改會影響引數。

  • 輸出引數 - 此方法有助於返回多個值。

是的!使用輸出引數。return 語句只能用於從函式返回一個值。但是,使用輸出引數,您可以從函式返回兩個值。

輸出引數類似於引用引數,只是它們將資料從方法傳出而不是傳入。引用引數將引數的記憶體位置的引用複製到形式引數中。這意味著對引數所做的更改會影響引數。

名稱空間旨在提供一種方法來使一組名稱與另一組名稱分開。在一個名稱空間中宣告的類名不會與在另一個名稱空間中宣告的相同類名衝突。

using 關鍵字用於在程式中包含名稱空間。程式通常有多個 using 語句。

值型別變數可以直接賦值。它們派生自 System.ValueType 類。

值型別直接包含資料。一些示例包括 int、char 和 float,它們分別儲存數字、字母和浮點數。當您宣告 int 型別時,系統會分配記憶體來儲存該值。

引用型別不包含儲存在變數中的實際資料,而是包含對變數的引用。

換句話說,它們引用記憶體位置。使用多個變數,引用型別可以引用記憶體位置。如果一個變數更改了記憶體位置中的資料,則另一個變數會自動反映此值的變化。內建引用型別的示例包括:object、dynamic 和 string。

在 C# 通用型別系統 (CTS) 中,物件型別是所有資料型別的最終基類。Object 是 System.Object 類的別名。物件型別可以賦值任何其他型別的的值,值型別,引用型別,預定義或使用者定義的型別。但是,在賦值之前,需要進行型別轉換。

將值型別轉換為物件型別時,稱為裝箱。

將物件型別轉換為值型別時,稱為拆箱。

您可以在動態資料型別變數中儲存任何型別的 value 。這些型別的變數的型別檢查在執行時進行。

宣告動態型別的語法為:

dynamic <variable_name> = value;

例如:

dynamic d = 20;

動態型別類似於物件型別,不同之處在於物件型別變數的型別檢查在編譯時進行,而動態型別變數的型別檢查在執行時進行。

指標型別變數儲存另一種型別的記憶體地址。C# 中的指標具有與 C 或 C++ 中的指標相同的功能。

宣告指標型別的語法為:

type* identifier;

例如

char* cptr;
int* iptr;

is 運算子確定物件是否為某種型別。

If( Ford is Car) // 檢查 Ford 是否是 Car 類的物件。

as 運算子進行強制轉換,如果強制轉換失敗,則不會引發異常。

Object obj = new StringReader("Hello");
StringReader r = obj as StringReader;

封裝被定義為“將一個或多個專案封裝在物理或邏輯包中的過程”。在面向物件程式設計方法中,封裝防止訪問實現細節。

使用訪問修飾符實現封裝。

訪問修飾符定義類成員的範圍和可見性。

公共訪問修飾符允許類將其成員變數和成員函式公開給其他函式和物件。任何公共成員都可以從類外部訪問。

私有訪問修飾符允許類將其成員變數和成員函式隱藏在其他函式和物件之外。只有相同類的函式才能訪問其私有成員。即使是類的例項也不能訪問其私有成員。

受保護的訪問修飾符允許子類訪問其基類的成員變數和成員函式。這樣它有助於實現繼承。

內部訪問修飾符允許類將其成員變數和成員函式公開給當前程式集中的其他函式和物件。換句話說,任何具有內部訪問修飾符的成員都可以從定義該成員的應用程式中定義的任何類或方法訪問。

受保護內部訪問修飾符允許類將其成員變數和成員函式隱藏在其他類物件和函式之外,除了相同應用程式中的子類之外。這在實現繼承時也會用到。

C# 提供了一種特殊的資料型別,即可空型別,您可以為其賦值正常範圍的值以及 null 值。

例如,您可以將 -2,147,483,648 到 2,147,483,647 之間的任何值或 null 儲存在 Nullable<Int32> 變數中。類似地,您可以在 Nullable<bool> 變數中賦值 true、false 或 null。

空合併運算子與可空值型別和引用型別一起使用。它用於將運算元轉換為另一個可空(或不可空)值型別運算元的型別,其中允許隱式轉換。

如果第一個運算元的值為 null,則運算子返回第二個運算元的值,否則它返回第一個運算元的值。

透過使用 params 關鍵字,可以指定一個方法引數,該引數接受可變數量的引數,甚至不接受任何引數。

不可以!在方法宣告中,params 關鍵字之後不允許使用其他引數。方法宣告中只允許使用一個 params 關鍵字。

Array 類是 C# 中所有陣列的基類。它在 System 名稱空間中定義。Array 類提供各種屬性和方法來處理陣列。

使用 Array.Sort(array) 函式。它使用陣列的每個元素的 IComparable 實現來對整個一維陣列中的元素進行排序。

首先使用 Array.Sort(array) 對陣列進行排序,然後使用 Array.Reverse(array) 方法對其進行反轉。

在 C# 中,結構體是一種值型別資料型別。它可以幫助您使單個變數儲存各種資料型別的相關資料。struct 關鍵字用於建立結構體。

結構體用於表示記錄。要定義結構體,必須使用 `struct` 語句。`struct` 語句定義了一種新的資料型別,它包含程式的多個成員。

類和結構體有以下基本區別:

  • 類是引用型別,而結構體是值型別。

  • 結構體不支援繼承。

  • 結構體不能有預設建構函式。

列舉是一組命名的整數常量。列舉型別使用 `enum` 關鍵字宣告。

C# 列舉是值資料型別。換句話說,列舉包含其自身的值,不能繼承也不能傳遞繼承。

類型別的預設訪問修飾符是 `internal`。

成員的預設訪問許可權是 `private`。

繼承是面向物件程式設計中最重要的概念之一。繼承允許我們根據另一個類來定義一個類,這使得建立和維護應用程式更加容易。這也提供了重用程式碼功能的機會,並加快了實現時間。

建立類時,程式設計師可以指定新類應該繼承現有類的成員,而不是編寫全新的資料成員和成員函式。這個現有類稱為基類,新類稱為派生類。

繼承的概念實現了 IS-A 關係。例如,哺乳動物是動物,狗是哺乳動物,因此狗也是動物,依此類推。

不支援!C# 不支援多重繼承。

一個類可以從多個類或介面派生,這意味著它可以繼承多個基類或介面的資料和函式。C# 中用於建立派生類的語法如下:

<acess-specifier> class <base_class>
{
   ...
}
class <derived_class> : <base_class>
{
   ...
}

多型性這個詞意味著具有多種形式。在面向物件程式設計正規化中,多型性通常表示為“一個介面,多個函式”。

多型性可以是靜態的或動態的。在靜態多型性中,對函式的響應是在編譯時確定的。在動態多型性中,它是在執行時確定的。

C# 提供兩種實現靜態多型性的技術。它們是:

  • 函式過載

  • 運算子過載

在編譯時將函式與物件連結的機制稱為早期繫結。它也稱為靜態繫結。

您可以在同一作用域中為同一個函式名有多個定義。函式的定義必須透過引數列表中引數的型別和/或數量來區分。您不能過載僅返回型別不同的函式宣告。

動態多型性由抽象類和虛擬函式實現。

當一個類被宣告為密封類時,它不能被繼承。

不可以!因為它不能建立,因為抽象類不能宣告為密封類。

當您在類中定義一個要在繼承類中實現的函式時,可以使用虛擬函式。虛擬函式可以在不同的繼承類中以不同的方式實現,對這些函式的呼叫將在執行時決定。

您可以重新定義或過載 C# 中提供的大多數內建運算子。因此,程式設計師也可以將運算子與使用者定義的型別一起使用。

過載的運算子是具有特殊名稱的函式,關鍵字 `operator` 後跟被定義的運算子的符號。與任何其他函式類似,過載的運算子具有返回型別和引數列表。

介面定義為所有繼承該介面的類都應遵循的語法約定。介面定義了語法約定的“什麼”部分,派生類定義了語法約定的“如何”部分。

介面定義屬性、方法和事件,這些是介面的成員。介面只包含成員的宣告。派生類有責任定義成員。這通常有助於提供派生類將遵循的標準結構。

預處理器指令指示編譯器在實際編譯開始之前預處理資訊。

所有預處理器指令都以 `#` 開頭,並且在一行上預處理器指令之前只能出現空格字元。預處理器指令不是語句,因此它們不以分號 (;) 結尾。

您可以使用 `#if` 指令建立條件指令。條件指令用於測試符號或符號以檢查它們是否計算結果為真。如果它們確實計算結果為真,則編譯器將計算 `#if` 和下一個指令之間的所有程式碼。

C# 異常由類表示。C# 中的異常類主要直接或間接地從 `System.Exception` 類派生。一些從 `System.Exception` 類派生的異常類是 `System.ApplicationException` 類和 `System.SystemException` 類。

`System.ApplicationException` 類支援應用程式程式生成的異常。因此,程式設計師定義的異常應該從此類派生。

`System.SystemException` 類是所有預定義系統異常的基類。

下一步是什麼?

接下來您可以回顧一下您之前完成的與該科目相關的作業,並確保您能夠自信地談論它們。如果您是應屆畢業生,面試官不會期望您回答非常複雜的問題,而是您必須使您的基礎概念非常紮實。

其次,如果您無法回答一些問題,這並不重要,重要的是您回答了什麼問題,您必須充滿信心地回答。所以在面試時要充滿信心。我們在 tutorialspoint 祝您面試順利,並祝您未來的事業一切順利。乾杯 :-)

csharp_questions_answers.htm
廣告