在[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 用於將對象的數據序列化為字節流,customserializableclass 是用於獲取反序列化時使用的構造函數。
[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: