在[DotNet 開發跳槽]公眾號中,版主為大家準備了一批.NET 實戰面試題:
本文站長透過 AI 補充了部分詳細的答案。這些面試題涵蓋了.NET 開發中的各個方面,包括.NET 框架、C# 語言、ASP.NET、ADO.NET、資料庫等。透過對比學習,我們可以更好地理解和掌握這些知識點。
在面試過程中,對於這些面試題的掌握和理解是非常重要的。面試官通常會透過這些問題來考察我們對.NET 開發的理解和實踐經驗。因此,透過學習這些面試題,我們可以更好地準備面試,提高自己的競爭力。
面試題目錄:
- 什麼是 CTS、CLS 和 CLR
- CLR 技術和 COM 技術的比較
- JIT 是如何工作的
- 怎麼把組件放入 GAC 中
- 值類型和引用類型的區別
- C# 中 string 和 String 有什麼區別
- 簡述.NET 中堆疊和堆的特性與差異
- .NET 中 GC 的運作機制
- 簡述 C# 中覆寫、多載和隱藏的概念
- 在 C# 中如何宣告一個類別不能被繼承
- Int[] 是引用類型還是值類型
- 解釋泛型的基本原理
- Serializable 屬性有何作用
- 如何自訂序列化和反序列化的過程
- 如何使用 IFormattable 介面實作格式化輸出
- .NET 提供了哪幾個計時器類型
- 在 System.Object 中定義的三個比較方法有何異同
- 請解釋委派的基本原理
- 委派回呼靜態方法和執行個體方法有何區別
- 什麼是鏈式委派
- 請解釋事件的基本使用方法
- 請解釋反射的基本原理和其實現的基石
- 如何利用反射來實作工廠模式
- 如何以較小的記憶體代價儲存 Type、Field 和 Method 資訊
- 什麼是執行緒
- 如何使用.NET 的執行緒集區
- C# 中的 lock 關鍵字有何作用
- 請解釋 ASP.NET 以什麼形式執行
- GET 請求和 POST 請求有何區別
- 介紹 ASP.NET 的頁面生命週期
- 列舉幾種實作頁面跳轉的方法
- 如何防止 SQL 注入式攻擊
- ADO.NET 支援哪幾種資料來源
- 請簡要敘述資料庫連線集區的機制
- 一個連線字串可以包含哪些屬性
- 什麼是強型別的 DataSet
- 什麼是 XML
- XML 中的命名空間如何使用
- .NET 中如何驗證一個 XML 文件的正確格式
- 什麼是 XSLT,XSLT 有何作用
- 如何在程式碼中使用 XSLT 文件
- 請簡述 SOAP 協定
- 如何在.NET 中建立 Web Service
- 如何產生 Web Service 代理類型
- 如何提高連線集區內連線的重用率
- ADO.NET 支援哪兩種方式來存取關聯式資料庫
- 什麼是關聯式資料庫和非關聯式資料庫
- Session 有哪幾種儲存方式,之間有何區別,如何進行設定
- 請簡述 ViewState 的功能和實作機制
- 什麼是資料庫列轉行、行轉列
- ADO.NET 和 ORM 是什麼關係
1. CTS、CLS 和 CLR
CTS(Common Type System)是.NET 中的一種規範,通用語言系統,定義了所有支援的資料類型和操作,確保不同語言之間的互通性。
CLS(Common Language Specification)是 CTS 的子集,定義了一組最小的規則和約定,以確保在不同語言中撰寫的程式碼可以相互呼叫。
CLR(Common Language Runtime)是.NET 的核心元件,負責將.NET 程式碼編譯成可執行程式碼並執行,提供了記憶體管理、安全性、例外處理等功能。
詳解:面試必備:NET 中 .CTS、CLS 和 CLR 分別作何解釋?
2. CLR 技術和 COM 技術的比較
CLR 技術和 COM 技術都是用於元件化開發的技術,但有一些區別。CLR 是面向受控程式碼的技術,提供了自動記憶體管理、型別安全性和例外處理等功能,支援多語言開發,它使得不同語言撰寫的程式碼能夠在一個統一的環境中執行。
COM 是面向非受控程式碼的技術,提供了元件化開發的機制,但需要手動管理記憶體和處理例外,只支援 C++ 和 COM 相容語言開發。
COM 需要手動管理記憶體,而 CLR 提供自動的記憶體回收機制。
CLR 提供了強大的安全性和程式碼存取權限管理,而 COM 的安全性較弱。
CLR 具有語言中立性,支援多種語言,而 COM 較傾向於使用 C++。
CLR 使用基於元資料的組件,而 COM 使用登錄檔進行元件的註冊和查詢。
3. JIT 是如何工作的
JIT:即時編譯(Just-In-Time),是 CLR 中的一個重要元件,負責將 IL 程式碼(中間語言)編譯成本機機器碼。JIT 在執行時根據需要將 IL 程式碼編譯成機器碼,以提高執行效率。
這是.NET 執行可執行程式的基本方式,也就是在需要執行的時候,才將對應的 IL 程式碼編譯為本機指令。傳入 JIT 的是 IL 程式碼,輸出的是本機程式碼,所以部分加密軟體透過掛鉤 JIT 來進行 IL 加密,同時又保證程式正常執行。同解釋執行的程式碼相比,JIT 的執行效率要高很多。
當 .NET 程式啟動時,IL 程式碼首先由 CLR 解釋執行。但為了提高執行效率,CLR 會將 IL 程式碼逐段編譯成本機程式碼,然後快取起來,供後續使用。
JIT 編譯是延遲編譯的一種形式,只有在實際需要執行某段 IL 程式碼時才會進行編譯。
JIT 有三種模式:
- 預編譯模式(Ngen),即將 IL 程式碼預先編譯成本機機器碼;
- 延遲編譯模式(JIT-Compiler),即在執行時期按需編譯 IL 程式碼;
- 混合模式(Mixed Mode),即同時使用預編譯和延遲編譯。
4. 如何把組件放入 GAC 中
將組件放入 GAC(Global Assembly Cache)中可以實現組件的全域共享和版本管理,通俗的理解就是存放各種.NET 平台下面需要使用的 dll 的地方。
可以使用 Gacutil 工具將組件安裝到 GAC 中(gacutil /i YourAssembly.dll),也可以手動將組件複製到 GAC 目錄(一般位於 C:\Windows\Assembly)中。
或者使用 .NET 程式碼進行安裝,安裝後也可以卸載。
在程式中引用 GAC 中的組件時,可以直接使用組件的名稱,而不需要指定完整的路徑。
5. 值類型和引用類型的區別
值類型和引用類型是.NET 中的兩種基本資料類型。
值類型儲存在堆疊上,包括整數、浮點數、字元等簡單類型,它們的值直接儲存在變數中。
引用類型儲存在堆積上,包括類別、介面、委派等複雜類型,變數儲存的是物件的參考,參考則儲存在堆疊或堆積上的某個位置,實際的物件儲存在堆積上。
值類型的賦值是將實際值複製到新變數,而引用類型的賦值是複製參考,指向相同的物件。
值類型的傳遞是按值傳遞,引用類型的傳遞是按參考傳遞。
值類型的每一次賦值都會執行一次逐欄位的複製,引用類型的賦值只是指標的傳遞,其實也是產生新的指標執行個體。
6. C# 中 string 和 String 有什麼區別
在 C# 中,string 是 C# 關鍵字,表示.NET 中的字串類型;
String 是 System.String 類別的別名,即 string 是 String 的別名,沒有實質性區別。
String 是來自 .NET Framework 的舊名稱。它在 C# 1.0 中引入,在 C# 2.0 中被 string 取代。在實際使用中,它們可以互相轉換,沒有實質性的區別。
7. .NET 中堆疊和堆的特色與差異
在.NET 中,堆積和堆疊是兩種不同的記憶體分配方式。
堆積用於儲存引用類型的物件,由記憶體回收器負責管理記憶體的分配和釋放,用 new、malloc 等分配記憶體函式分配得到的就是在堆積上。
堆疊用於儲存值類型的變數和方法呼叫的上下文資訊,由編譯器自動管理記憶體的分配和釋放,在函式本體中定義的變數通常在堆疊上。
堆積的分配速度較慢,但可以動態分配和釋放記憶體,是無序的,他是一片不連續的記憶體域,使用者自己來控制和釋放,如果使用者自己不釋放的話,當記憶體達到一定的特定值時,透過記憶體回收器(GC)來回收。
堆疊的分配速度較快,但大小固定且生命週期短暫,存放在堆疊中時要管儲存順序,保持著先進後出的原則,他是一片連續的記憶體域,系統自動分配和維護,堆疊記憶體無需我們管理,也不受 GC 管理。當堆疊頂元素使用完畢,立即釋放。而堆積則需要 GC 清理。使用引用類型的時候,一般是對指標進行的操作而非引用類型物件本身。但是值類型則操作其本身。
堆疊的生命週期由方法呼叫決定,堆積上的物件生命週期較長,由記憶體回收器管理。
8. .NET 中 GC 的運作機制
GC 是**記憶體回收(Garbage Collect)**的縮寫,是 CLR 的一部分,是.NET 核心機制的重要部分,是自動管理記憶體的機制,透過定期檢查不再使用的物件並釋放其佔用的記憶體。記憶體回收器會追蹤物件的參考關係,當一個物件不再被參考時,記憶體回收器會將其標記為垃圾物件,並在適當的時候回收其佔用的記憶體。記憶體回收器有不同的演算法和策略,如標記-清除、複製、標記-壓縮等。
基本工作原理就是遍歷受控堆積中的物件,標記哪些被使用物件(哪些沒人使用的就是所謂的垃圾),然後把可到達物件轉移到一個連續的位址空間(也叫壓縮),其餘的所有沒用的物件記憶體被回收掉。
9. 覆寫、多載和隱藏的概念
在 C# 中,覆寫(override)是指衍生類別重新實作基底類別的虛擬方法。
多載(overload)是指在同一個類別中定義多個同名但參數列表不同的方法,進行多次多載以適應不同的需要,指「覆蓋」,是指子類別覆蓋了父類別的方法。子類別的物件無法再存取父類別中的該方法。
隱藏(new)是指子類別隱藏了父類別的方法,當然,透過一定的轉換,可以在子類別的物件中存取父類別的方法,如果使用子類別宣告的物件,呼叫隱藏方法會呼叫子類別的,如果使用父類別宣告物件,那麼就會呼叫父類別中的隱藏方法。【參考:C#——隱藏方法】
覆寫和多載都是多型的表現形式,而隱藏是隱藏基底類別的成員。
詳解:面試必備:C#實現多型的過程中 overload 多載 與 override 覆寫的區別
10. 在 C# 中如何宣告一個類別不能被繼承
在 C# 中,可以使用 sealed 關鍵字來宣告一個類別不能被繼承。當一個類別被宣告為 sealed 時,其他類別就不能再繼承該類別。
sealed class MySealedClass { }
11. int[] 是引用類型還是值類型
int[] 是引用類型,因為它是陣列類型,陣列類型是引用類型,儲存在堆積上,而陣列變數本身儲存在堆疊上,指向堆積中的資料。
12. 解釋泛型的基本原理
泛型是.NET 中的一種特性,它允許在編譯時期指定型別參數,以實現型別安全和程式碼重用。泛型的基本原理是透過編譯時期的型別檢查和型別推斷,產生特定型別的程式碼。在執行時期,泛型程式碼會被實體化為具體的型別,以提高執行效率。
泛型允許撰寫能夠與不同資料類型一起工作的程式碼,而不必針對每個型別撰寫不同的程式碼。
在使用泛型時,可以定義一種範本(類別、介面、方法等),其中的某些型別可以由實際使用時指定。
13. Serializable 屬性有何作用
Serializable 屬性用於標記一個類別可以被序列化,即可以將物件轉換為位元組流進行儲存或傳輸。Serializable 屬性告訴編譯器和執行時期環境,該類別的執行個體可以被序列化和反序列化。
序列化是將物件轉換為位元組流,反序列化則是將位元組流轉換為物件。
14. 如何自訂序列化和反序列化的過程
自訂序列化和反序列化的過程可以透過實作 ISerializable 介面來實現。ISerializable 介面定義了兩個方法:GetObjectData 用於將物件的資料序列化為位元組流,以及用於取得反序列化時使用的建構函式。
[Serializable]
public class CustomSerializableClass : ISerializable
{
public string Name { get; set; }
public int Age { get; set; }
// 實作 ISerializable 介面的方法
public void GetObjectData(SerializationInfo info, StreamingContext context)
{
info.AddValue("Name", Name);
info.AddValue("Age", Age);
}
// 建構函式用於反序列化
protected CustomSerializableClass(SerializationInfo info, StreamingContext context)
{
Name = info.GetString("Name");
Age = info.GetInt32("Age");
}
}
15. 如何使用 IFormattable 介面實作格式化輸出
使用 IFormattable 介面可以實作格式化輸出。IFormattable 介面定義了一個方法 ToString,該方法接受一個格式字串和一個格式提供者作為參數,根據格式字串和格式提供者的要求,將物件轉換為字串。
參考:IFormattable 介面 (System) | Microsoft Learn
16. .NET 提供了哪幾個計時器類型
.NET 提供了幾個計時器類型,包括 System.Timers.Timer、System.Threading.Timer 和 System.Windows.Forms.Timer。
System.Timers.Timer
這是基於事件的計時器,位於 System.Timers 命名空間中。它是對 System.Threading.Timer 的封裝,更適合用於多執行緒環境中,因為回呼方法預設在建立計時器的執行緒上執行。它支援單次或週期性的任務排程。
System.Threading.Timer
這是基於執行緒的計時器,位於 System.Threading 命名空間中。它以指定的時間間隔執行回呼方法,可以實現單次或週期性的任務排程。需要注意的是,回呼方法在另一個執行緒上執行,所以在回呼方法中要小心處理執行緒同步問題。
System.Windows.Forms.Timer
這是 Windows 表單應用程式中的計時器,位於 System.Windows.Forms 命名空間中。它主要用於在 Windows 表單應用程式中執行週期性的 UI 更新,回呼方法執行在 UI 執行緒上。
System.Diagnostics.Stopwatch
這是一個高精度的計時器,位於 System.Diagnostics 命名空間中。儘管不是典型的計時器,但它用於測量程式碼區段的執行時間,可以幫助你進行效能分析。
System.Threading.Tasks.Task.Delay
這不是傳統的計時器,而是透過 Task.Delay 方法實現的非同步延遲。它允許你等待一段時間後執行非同步操作,可以用於實現延遲任務。
詳解:C#3 種計時器使用
17. 在 System.Object 中定義的三個比較方法有何異同
在 System.Object 中定義了三個比較方法,他們是 Equals(object),Equals(object, object),ReferenceEquals(object, object)。
這三個方法都用於比較兩個物件是否相等。但是,它們的比較方式不同。
Equals(object) 方法是虛擬方法,可以被子類別覆寫。它比較兩個物件的值是否相等。
Equals(object, object) 方法是靜態方法,不能被子類別覆寫。它比較兩個物件的參考是否相等。
ReferenceEquals(object, object) 方法是靜態方法,不能被子類別覆寫。它比較兩個物件的參考是否指向同一物件。
18. 請解釋委派的基本原理
C# 中的委派(Delegate)類似於 C 或 C++ 中函式的指標。委派(Delegate) 是存有對某個方法的參考的一種參考類型變數,參考可在執行時被改變。它本質上也是一個類別,它定義了方法的類型,使得可以將方法當作另一個方法的參數來進行傳遞,這是一種將方法動態地賦予參數的做法。
委派是一種參考類型,用於封裝對方法的呼叫,允許以類似於函式指標的方式傳遞方法作為參數。 委派包含一個方法的參考和一個可選的目標物件,呼叫委派時實際呼叫的是委派所參考的方法。
委派的基本原理是透過委派執行個體來呼叫方法,委派執行個體包含了方法的參考和呼叫的上下文資訊。
19. 委派回呼靜態方法和執行個體方法有何區別
委派回呼靜態方法和執行個體方法的區別在於呼叫的方式。當委派回呼靜態方法時,可以直接使用類別名稱呼叫靜態方法;當委派回呼執行個體方法時,需要先建立一個執行個體物件,然後使用執行個體物件呼叫執行個體方法。
//虛擬碼 僅供參考
// 委派回呼靜態方法
Action<int> myAction = MyStaticMethod;
myAction(10);
// 委派回呼執行個體方法
MyClass myObject = new MyClass();
Action<MyClass> myAction2 = myObject.MyInstanceMethod;
myAction2(myObject);
20. 什麼是鏈式委派
鏈式委派是指將多個委派物件鏈接在一起,形成一個委派鏈。當呼叫鏈式委派時,會依序呼叫每個委派物件,直到遇到一個委派物件回傳非空值或者所有委派物件都被呼叫完為止。鏈式委派可以用於實現事件處理常式鏈、非同步操作鏈和其他複雜的任務。
在 C# 中,可以使用 + 運算子來鏈結委派。例如,以下程式碼將兩個委派鏈結在一起:
Action<int> myAction1 = (x) => Console.WriteLine(x);
Action<int> myAction2 = (x) => Console.WriteLine(x * x);
Action<int> myChainedAction = myAction1 + myAction2;
myChainedAction(10); // 輸出:10 100
21. 請解釋事件及基本使用方法
事件是類別成員,用於允許類別在發生特定情況時通知其他類別或程式碼。
定義事件時,需要使用 delegate 關鍵字宣告一個委派類型,然後定義一個事件成員。
透過 += 運算子將訂閱者的方法添加到事件的委派鏈中,當事件觸發時,委派鏈中的方法將被呼叫。
22. 請解釋反射的基本原理和其實現的基石
反射是.NET 中的一種機制,用於在執行時期取得和操作類型的資訊。
反射是 .NET 平台的一個重要特性,允許在執行時期取得和操作組件、類型、成員等資訊。
反射的基本原理是透過元資料來描述類型的結構,執行時期可以存取這些元資料,從而取得有關類型資訊的詳細內容。
反射的基石是元資料(metadata),它是組件的一部分,包含有關類型、成員、方法等的描述資訊。這使得程式可以在執行時期了解其自身的結構和組成。
23. 如何利用反射來實作工廠模式
首先了解工廠模式是怎麼實現的,工廠模式就是代替了實體化類別。使用反射實現工廠模式可以允許根據特定的類別名稱或條件建立物件的執行個體,而無需明確指定每個物件的實體化(new 物件)。
using System;
// 定義介面
public interface IVehicle
{
void Move();
}
// 實作 IVehicle 介面的兩個類別
public class Car : IVehicle
{
public void Move()
{
Console.WriteLine("Car is moving");
}
}
public class Bike : IVehicle
{
public void Move()
{
Console.WriteLine("Bike is moving");
}
}
// 工廠類別,利用反射根據類別名稱建立物件執行個體
public class VehicleFactory
{
public IVehicle CreateInstance(string vehicleType)
{
Type type = Type.GetType(vehicleType); // 取得類型
if (type == null || !typeof(IVehicle).IsAssignableFrom(type))
{
throw new ArgumentException("無效車類型");
}
// 建立執行個體
IVehicle vehicle = (IVehicle)Activator.CreateInstance(type);
return vehicle;
}
}
//main呼叫
#region
// 工廠類別執行個體
VehicleFactory factory = new VehicleFactory();
// 透過工廠類別建立不同類型的執行個體
IVehicle car = factory.CreateInstance("Car");
IVehicle bike = factory.CreateInstance("Bike");
car.Move(); // 輸出:Car is moving
bike.Move(); // 輸出:Bike is moving
#endregion
24. 如何以較小的記憶體代價儲存 Type、Field 和 Method 資訊
使用輕量級的結構如 System.Reflection.Emit 中的 DynamicMethod 或 DynamicType 來儲存 Type、Field 和 Method 資訊,以較小的記憶體開銷建立和操作類型。
25. 什麼是執行緒
執行緒是程式執行的最小單位,是作業系統進行任務排程的基本單位。一個處理程序可以包含多個執行緒,每個執行緒都有自己的執行路徑和執行狀態。執行緒可以並行執行,提高程式的執行效率。在 .NET 中,System.Threading 命名空間提供了對執行緒的支援。
26. 如何使用.NET 的執行緒集區
執行緒集區允許重複使用執行緒以提高效能,減少執行緒的建立和銷毀開銷,可以使用 ThreadPool.QueueUserWorkItem 方法將工作項目排入執行緒集區,由執行緒集區中的執行緒執行。可以使用 ThreadPool 類別來使用.NET 的執行緒集區。
static void Main()
{
// 將工作項目放入執行緒集區佇列
ThreadPool.QueueUserWorkItem(DoWork, "Hello ThreadPool!");
ThreadPool.QueueUserWorkItem(DoWork, "Hello ThreadPool2!");
// 主執行緒繼續執行其他工作
Console.WriteLine("歡迎關注公眾號[dotnet開發跳槽].");
// 防止主控台直接關閉
Console.ReadLine();
}
static void DoWork(object state)
{
// 從執行緒集區中的執行緒執行的工作方法
string message = (string)state;
Console.WriteLine($"ThreadPool 工作: {message}");
}
27. C# 中的 lock 關鍵字有何作用
執行緒安全是重點,lock 關鍵字用於確保多執行緒環境下對共享資源的安全存取。它透過取得物件的互斥鎖來保護程式碼區塊,使得只有一個執行緒能夠進入臨界區,直到該執行緒釋放鎖。lock 關鍵字可以確保在同一時間只有一個執行緒可以存取被鎖定的程式碼區塊,避免多個執行緒同時存取共享資源導致的資料不一致問題。
28. 請解釋 ASP.NET 以什麼形式執行
ASP.NET 執行在 Web 伺服器上,透過處理 HTTP 請求和產生 HTTP 回應來提供 Web 服務。ASP.NET 可以以處理程序外或處理程序內模式執行,包括 IIS 處理程序宿主模式和自裝載模式。
如果是 ASP.NET Core 呢?
ASP.NET Core 也可以執行在 Web 伺服器上,透過處理 HTTP 請求和產生 HTTP 回應來提供 Web 服務。與傳統的 ASP.NET 不同,ASP.NET Core 是跨平台的,可以在 Windows、Linux 和 macOS 等作業系統上執行。
ASP.NET Core 可以以處理程序外或處理程序內模式執行。在處理程序外模式下,ASP.NET Core 應用程式執行在獨立的處理程序中,可以透過 HTTP 協定與 Web 伺服器進行通訊。常見的 Web 伺服器包括 IIS、Nginx 和 Apache 等。
在處理程序內模式下,ASP.NET Core 應用程式直接嵌入到 Web 伺服器處理程序中,與 Web 伺服器共享同一個處理程序空間。這種模式下,ASP.NET Core 應用程式可以更有效率地處理請求,減少了處理程序間通訊的開銷。
ASP.NET Core 還支援自裝載模式,即應用程式可以直接作為一個獨立的主控台應用程式執行,不依賴於任何 Web 伺服器。在自裝載模式下,ASP.NET Core 應用程式可以使用 Kestrel 作為內建的 Web 伺服器,也可以使用其他第三方的 Web 伺服器。
總之,ASP.NET Core 可以以處理程序外或處理程序內模式執行,並且支援自裝載模式,可以根據具體的需求選擇合適的執行方式。
29. GET 請求和 POST 請求有何區別
GET 請求和 POST 請求是 HTTP 協定中的兩種常見請求方法,其實區別不大,主要區別在於資料傳輸方式。GET 請求將請求參數附加在 URL 中,以明文形式傳輸,適用於取得資料;POST 請求將請求參數放在請求本文中,較安全且無長度限制,適用於提交資料。GET 請求的參數有長度限制,POST 請求的參數沒有長度限制。
HTTP GET 請求的查詢參數長度是有限制的,不同瀏覽器對查詢參數長度的限制也有所不同。以下是一些常見瀏覽器對查詢參數長度的限制:
- Internet Explorer:Internet Explorer 9 及以下版本的查詢參數長度限制為 2,083 個字元。
- Microsoft Edge:Microsoft Edge 瀏覽器的查詢參數長度限制為 8,192 個字元。
- Chrome:Chrome 瀏覽器的查詢參數長度限制為 8,192 個字元。
- Firefox:Firefox 瀏覽器的查詢參數長度限制為 65,536 個字元。
- Safari:Safari 瀏覽器的查詢參數長度限制為 80,000 個字元。
需要注意的是,這些限制是指查詢參數的長度,不包括 URL 的其他部分(如協定、網域名稱、路徑等)。另外,不同版本的瀏覽器可能會有所不同,以上限制僅供參考。如果需要傳遞較長的查詢參數,可以考慮使用 POST 請求或將參數放在請求本文中傳遞。
30. 介紹 ASP.NET 的頁面生命週期
ASP.NET 的頁面生命週期包括多個階段,如頁面初始化、頁面載入、頁面呈現、事件處理、頁面卸載等。在每個階段,ASP.NET 會呼叫相應的事件處理方法,開發人員可以在這些方法中撰寫自己的程式碼來實現特定的功能。
31. 列舉幾種實現頁面跳轉的方法
傳統的 MVC 專案使用,新專案一般讀寫分離。實現頁面跳轉的方法包括:Response.Redirect、Server.Transfer、Server.Execute、使用超連結或按鈕控制項的導航功能、使用 JavaScript 的 window.location 方法等。
32. 如何防止 SQL 注入式攻擊
現在基本用 ORM,一般不會出現。為了防止 SQL 注入式攻擊,可以使用參數化查詢或預存程序來執行資料庫操作。參數化查詢將使用者輸入的資料作為參數傳遞給資料庫,而不是將使用者輸入的資料直接拼接到 SQL 陳述式中,對輸入資料進行驗證和過濾,以防止惡意注入 SQL 程式碼。預存程序將 SQL 陳述式封裝在資料庫中,可以透過參數傳遞使用者輸入的資料。
33. ADO.NET 支援哪幾種資料來源
ADO.NET 如果持續開發,支援的資料來源將是無限的。ADO.NET 支援多種資料來源,包括 SQL Server、Oracle、OLEDB、ODBC 和 XML 等。
34. 請簡要敘述資料庫連線集區的機制
資料庫連線集區是一種用於管理資料庫連線的機制。它透過在應用程式啟動時建立一定數量的資料庫連線,並將這些連線儲存在連線集區中,當應用程式需要連線資料庫時,從連線集區中取得一個可用的連線,使用完畢後將連線回傳給連線集區而不是關閉連線,這樣可以減少連線的開啟和關閉所需的時間開銷,以提高連線的重用率和效能。
35. 一個連線字串可以包含哪些屬性
連線字串可以包含多個屬性,如資料來源、使用者名稱、密碼、連線逾時時間等。常見的連線字串屬性包括:Data Source(資料來源)、Initial Catalog(資料庫名稱)、User ID(使用者名稱)、Password(密碼)、Connect Timeout(連線逾時時間)等,具體取決於所連線的資料庫和提供者。
36. 什麼是強型別的 DataSet
強型別的 DataSet 是在設計時期已知其結構的 DataSet。它是透過 Visual Studio 的 Dataset Designer 建立的,具有編譯時期的型別檢查和 IntelliSense 支援。在強型別的 DataSet 中,資料表和資料行的類型是明確指定的,而不是使用通用的 Object 類型。
37. 什麼是 XML
XML(eXtensible Markup Language)是一種用於儲存和傳輸資料的標記語言。它使用標籤來描述資料的結構和內容,具有自我描述性和可擴充性的特點。
38. XML 中的命名空間如何使用
XML 中的命名空間用於避免元素和屬性名稱的衝突。可以使用 xmlns 屬性來定義命名空間,使用前置詞來參考命名空間中的元素和屬性。
39. .NET 中如何驗證一個 XML 文件的格式
可以使用 XML Schema Definition (XSD) 檔案對 XML 文件進行驗證,或使用 XmlReader 類別,或 XmlDocument 類別來驗證一個 XML 文件的格式。
XmlReader 類別提供了一種串流式的方式來讀取和驗證 XML 文件,可以透過設定 XmlReaderSettings 類別的屬性來指定驗證選項;
XmlDocument 類別提供了一種 DOM 方式來讀取和驗證 XML 文件,可以透過設定 XmlValidatingReader 類別的屬性來指定驗證選項。
40. 什麼是 XSLT,XSLT 有何作用
XSLT(eXtensible Stylesheet Language Transformations)用於將一個 XML 文件轉換成另一個 XML 文件、HTML 頁面或其他文字格式,它是一種基於 XML 的轉換語言。XSLT 可以透過定義模板和規則來對 XML 文件進行轉換和處理,常用於將 XML 文件轉換為 HTML、PDF 等格式。
41. 如何在程式碼中使用 XSLT 文件
使用 .NET Framework 中的類別,如 XslCompiledTransform 或 XmlDocument 載入 XSLT 文件,然後套用該文件來轉換 XML 資料,使用 Transform 方法將 XML 文件轉換為其他格式。
42. 請簡述 SOAP 協定
SOAP(Simple Object Access Protocol)是一種用於交換結構化資訊的通訊協定。它使用 XML 格式來封裝和傳輸資料,允許基於網路的服務之間進行通訊,並支援不同環境和語言之間的互通性。
43. 如何在.NET 中建立 Web Service
可以使用 ASP.NET 的 WebService 類別來建立 Web Service。可以在 Web Service 類別中定義公開的方法,然後使用 WebMethod 屬性標記這些方法,以便可以透過 HTTP 請求呼叫這些方法。
44. 如何產生 Web Service 代理類型
可以使用 wsdl.exe 工具或 Visual Studio 的「新增服務參考」功能來產生 Web Service 代理類型。wsdl.exe 工具可以根據 Web Service 的 WSDL 文件產生代理類別,而「新增服務參考」功能可以根據 Web Service 的中繼資料產生代理類別。產生的代理類別可以用於呼叫 Web Service 的方法。
45. 如何提高連線集區內連線的重用率?
答:可以透過以下幾種方式來提高連線集區內連線的重用率:
- 合理設定連線集區的參數:可以根據應用程式的需求,設定連線集區的最大連線數、最小連線數、連線逾時時間等參數。合理的參數設定可以避免連線集區中連線的過度建立和銷毀,提高連線的重用率。
- 使用連線集區內連線的釋放機制:在使用連線集區內的連線時,及時釋放連線資源是非常重要的。可以使用 using 陳述式或手動呼叫連線的 Close 方法來釋放連線資源,確保連線能夠及時回到連線集區中,供其他請求重用。
- 避免長時間佔用連線:在使用連線時,盡量減少連線的佔用時間。可以在執行完資料庫操作後,及早釋放連線資源,避免長時間佔用連線,提高連線的可用性和重用率。
- 使用連線字串連線集區屬性:連線字串中可以設定連線集區相關的屬性,如最大連線數、連線逾時時間等。透過合理設定這些屬性,可以控制連線集區中連線的數量和生命週期,提高連線的重用率。
46. ADO.NET 支援哪兩種方式來存取關聯式資料庫?
答:ADO.NET 支援透過兩種提供者來存取關聯式資料庫:
- SQLClient 提供者:SQLClient 提供者是 ADO.NET 中用於存取 Microsoft SQL Server 資料庫的提供者。它提供了一組用於連線、執行 SQL 陳述式和處理結果的類別和方法,可以方便地與 SQL Server 資料庫進行互動。
- OLEDB 提供者:OLEDB 提供者是一種通用的資料存取介面,可以用於存取多種類型的關聯式資料庫。它提供了一組用於連線、執行 SQL 陳述式和處理結果的類別和方法,可以透過配接器模式來適配不同的資料庫。
47. 什麼是關聯式資料庫?非關聯式資料庫呢?
關聯式資料庫是一種使用表格來組織和儲存資料的資料庫。它使用關聯模型來描述資料之間的關係,透過表格中的資料行和資料列來儲存和表示資料。關聯式資料庫使用結構化查詢語言(SQL)來進行資料操作和查詢。
非關聯式資料庫是指不使用關聯模型和 SQL 的資料庫。它們使用不同的資料模型和查詢語言來儲存和操作資料。常見的非關聯式資料庫包括文件資料庫、鍵值資料庫、資料行儲存資料庫等。非關聯式資料庫通常更適合儲存和處理大量的非結構化資料,具有更高的可擴充性和靈活性。
48. Session 有哪幾種儲存方式,之間有何區別,如何進行設定?
Session 有以下幾種儲存方式:
- 伺服器記憶體:將 Session 資料儲存在伺服器的記憶體中。這種方式存取速度快,但會佔用伺服器的記憶體資源。
- 資料庫:將 Session 資料儲存在資料庫中。這種方式可以實現 Session 的持久化,但會增加資料庫的存取開銷。
- 外部服務(如 Redis):將 Session 資料儲存在外部的快取服務中,如 Redis。這種方式可以實現 Session 的分散式儲存和共享,提高系統的可擴充性和效能。
設定 Session 的儲存方式可以透過設定檔或程式碼來實現。在 ASP.NET 中,可以透過 Web.config 檔案的 <sessionState> 元素來設定 Session 的儲存方式和其他屬性。可以設定 mode 屬性來指定儲存方式(如 InProc、SQLServer、Redis 等),並設定相應的連線字串或其他設定資訊。也可以透過程式碼來設定 Session 的儲存方式,如使用 SessionStateModule 的 SessionStateMode 屬性來設定儲存方式。
49. 請簡述 ViewState 的功能和實作機制
ViewState 是用於在 Web 頁面的 postback 之間儲存頁面控制項的狀態資訊的一種機制。它可以儲存頁面控制項的屬性值、事件狀態和檢視狀態等資訊,以便在頁面回傳時恢復頁面的狀態。
ViewState 的實作機制是將頁面控制項的狀態資訊儲存在隱藏欄位中,這個隱藏欄位的名稱為 __VIEWSTATE。在頁面回傳時,ASP.NET 會自動將隱藏欄位的值解析並恢復頁面控制項的狀態。
ViewState 的功能包括:
- 儲存頁面控制項的屬性值:ViewState 可以儲存頁面控制項的屬性值,包括文字方塊的文字、核取方塊的選取狀態、下拉式清單的選取項目等。
- 儲存頁面控制項的事件狀態:ViewState 可以儲存頁面控制項的事件狀態,包括按鈕的點擊事件、核取方塊的選取事件等。
- 儲存頁面控制項的檢視狀態:ViewState 可以儲存頁面控制項的檢視狀態,即控制項在頁面上的位置和樣式等資訊。
需要注意的是,ViewState 會增加頁面的大小,增加網路傳輸的開銷。在使用 ViewState 時,應該注意控制 ViewState 的大小,避免過多的資料傳輸和頁面載入的延遲。可以透過設定 EnableViewState 屬性來控制是否啟用 ViewState,以及透過 ViewStateMode 屬性來控制 ViewState 的模式(如 Enabled、Disabled、Inherit 等)。
50. 什麼是資料庫行轉列,列轉行
資料庫行轉列和列轉行是指在資料庫中進行資料轉換的操作。
資料庫行轉列(Row to Column)是將資料庫中的列資料轉換為行資料的操作。通常情況下,資料庫中的資料是以列的形式儲存的,每一列代表一個記錄,每一行代表一個欄位。但在某些情況下,我們可能需要將列資料轉換為行資料,以便更方便地進行資料分析和查詢。這可以透過使用彙總函數、PIVOT 操作或自訂查詢陳述式來實現。
資料庫列轉行(Column to Row)是將資料庫中的行資料轉換為列資料的操作。與行轉列相反,列轉行是將資料庫中的行資料按照某種規則轉換為列資料。這可以透過使用 UNPIVOT 操作或自訂查詢陳述式來實現。
51. ADO.NET 和 ORM 是什麼關係
ADO.NET(ActiveX Data Objects .NET)和 ORM(Object-Relational Mapping)是兩種用於存取資料庫的技術,它們在資料庫存取的層次上有一定的關係。
ADO.NET 是.NET 框架中用於存取資料庫的一組類別和方法。它提供了一種基於連線、命令和資料讀取器的方式來與資料庫進行互動。ADO.NET 透過提供一系列的類別(如 SqlConnection、SqlCommand、SqlDataReader 等)和方法來實現對資料庫的連線、執行 SQL 陳述式和處理結果。
ORM 是一種將物件模型和關聯式資料庫之間進行對映的技術。它可以將資料庫中的資料表和記錄對映為物件和屬性,使開發人員可以使用物件導向的方式來操作資料庫。ORM 框架可以自動處理物件和資料庫之間的轉換,簡化了資料存取層的開發工作。
ADO.NET 和 ORM 之間的關係是,ADO.NET 是一種底層的資料庫存取技術,而 ORM 是在 ADO.NET 的基礎上提供了更高層次的抽象和封裝。ORM 框架可以使用 ADO.NET 作為底層的資料庫存取技術,透過對映物件和資料庫之間的關係,實現物件的持久化和資料庫操作的簡化。
使用 ORM 框架可以將資料庫操作轉化為對物件的操作,使開發人員可以更加專注於業務邏輯的實現,而不需要關注底層的資料庫存取細節。ORM 框架可以提供更高的開發效率和程式碼的可維護性,同時也可以提供一些額外的功能,如快取、延遲載入等。但需要注意的是,ORM 框架並不適用於所有的專案和場景,對於一些複雜的資料庫操作,仍然需要使用 ADO.NET 的底層功能來實現。
總結
本文列出了網友提供的.NET 面試題,以及每個問題的參考答案,希望對你的面試準備有所幫助。上面的部分題目較舊,這也反映了公司技術偏舊。由於面試場景和問題方向不同,大家可以根據不同情況酌情回答,答案僅供參考。要想面試得心應手,還需要不斷提高自己的基礎知識,並了解最新的技術方向。
文中面試題如有不同見解,可於文章下留言或提交 PR: