以下是優化后的版本,在原有內容基礎上補充了應用場景 ,其他結構保持不變:
上位機面試題解答(技術詳解+示例)
C#-IOC框架
1. 值類型和引用類型的本質區別
解釋
值類型 :存儲在棧中,直接保存數據值(如 int
, struct
)。引用類型 :存儲在堆中,變量保存對象地址(如 class
, string
)。
對比表格
特性 值類型 引用類型 存儲位置 棧(Stack) 堆(Heap) 賦值行為 復制數據本身 復制對象地址 默認值 0或false
(根據類型) null
裝箱/拆箱 支持(值類型轉為對象) 不適用
應用場景
值類型 :適合存儲輕量級數據(如傳感器數值、坐標),避免頻繁堆內存分配。引用類型 :管理復雜對象(如設備連接、數據庫上下文),支持多處共享引用。
示例
int temperature = 25 ;
Device device = new Device ( ) ;
2. 抽象類和接口的區別
解釋
抽象類 :可包含方法實現、字段和構造函數,支持單繼承。接口 :僅定義方法簽名,支持多繼承,無實現。
對比表格
特性 抽象類 接口 方法實現 可有具體實現或抽象方法 僅定義方法簽名(C# 8.0后支持默認實現) 繼承規則 單繼承 多繼承 構造函數 支持 不支持 適用場景 共同實現邏輯(如 Animal
基類) 行為契約(如 IPlayable
接口)
應用場景
抽象類 :物聯網設備驅動開發中,定義基礎通信邏輯(如 AbstractModbusDevice
)。接口 :定義跨平臺協議(如 ICommunicationProtocol
),支持 Modbus
, OPC UA
等多協議實現。 可以包含抽象成員: 抽象類可以包含抽象方法、抽象屬性等,這些成員沒有具體的實現,必須由派生類實現。 可以包含非抽象成員: 抽象類也可以包含普通的方法、屬性、字段等,這些成員可以直接在抽象類中實現。
示例
public abstract class BaseDevice { protected void Connect ( ) { } public abstract void ReadData ( ) ;
}
public interface IProtocol { void SendCommand ( string cmd) ;
}
3. 委托和事件的區別
解釋
委托 :封裝方法引用,支持多播。事件 :委托的封裝,提供訪問控制(僅發布者可觸發)。
對比表格
特性 委托 事件 訪問控制 無限制(可被任何代碼調用) 通過 event
關鍵字保護 多播支持 支持 支持 適用場景 一般方法調用 事件驅動場景(如按鈕點擊)
應用場景
委托 :實現回調函數(如異步任務完成時的 TaskCompletionSource
)。事件 :設備狀態變化通知(如 Device.OnDataReceived
)。
示例
public event EventHandler< DataReceivedEventArgs> OnDataReceived;
OnDataReceived?. Invoke ( this , new DataReceivedEventArgs ( buffer) ) ;
4. IOC依賴注入的注入方式
解釋
構造函數注入 :通過構造函數傳遞依賴。屬性/方法注入 :通過屬性或方法設置依賴(較少使用)。
對比表格
方式 構造函數注入 屬性注入 方法注入 推薦程度 強烈推薦 不推薦 不推薦 可維護性 高(顯式聲明依賴) 低(隱藏依賴) 低 適用場景 99%的場景 避免使用 避免使用
應用場景
構造函數注入 :云服務中注入數據庫上下文(如 MyService(IService service)
)。屬性注入 :遺留代碼中快速集成第三方庫(需謹慎使用)。
示例
public class DeviceService { private readonly ICommunication _comm; public DeviceService ( ICommunication comm) { _comm = comm; }
}
5. C#集合簡單介紹
解釋
List :動態數組,適合隨機訪問和遍歷。Dictionary<TKey,TValue> :哈希表,快速查找鍵值對。LinkedList :鏈表結構,插入刪除高效。
對比表格
集合類型 增刪效率 查找效率 線程安全 適用場景 List<T>
低(O(n)) 高(O(1)) 否 頻繁遍歷,少量增刪 Dictionary
中(O(1)) 高(O(1)) 否 頻繁按鍵查找(如設備ID映射) LinkedList<T>
高(O(1)) 低(O(n)) 否 頻繁插入/刪除(如隊列)
應用場景
List :存儲設備列表(如 List<Device>
)。Dictionary :設備ID到實例的映射(如 Dictionary<string, Device>
)。
示例
var devices = new List< Device> ( ) ;
var deviceMap = new Dictionary< string , Device> ( ) ;
6. C#垃圾回收機制&#x