面向對象面試題集合

前言

記錄面向對象面試題相關內容,方便復習及查漏補缺

題1.簡述面向對象?主要特征是什么?

面向對象編程(Object-Oriented Programming,簡稱OOP)是一種以“對象”為核心的編程范式,通過將現實世界的實體抽象為“類”和“對象”,將屬性和行為封裝在一起,模擬實體間的交互。

其核心思想是通過模塊化、代碼復用和靈活擴展來實現軟件的可維護性和可擴展性

主要特征:

  1. 封裝(Encapsulation):將屬性和行為封裝在類中,隱藏內部的實現細節,對外提供公開的接口和對象進行交互,其內部狀態不能直接訪問。其作用可用增強數據的安全性(例如通過訪問修飾符限制直接訪問),降低模塊間的耦合度,簡化代碼的使用
  2. 繼承(Inheritance):子類可以繼承父類的屬性和方法,并在此基礎上通過擴展或重新功能。其作用實現代碼復用,構建層次化的類結構,支持邏輯分類和功能呢擴展
  3. 多態(Polymorphism):同一方法作用于不同的對象時,可能產生不同的行為。實現方式:通過方法重寫(子類覆蓋父類方法)和接口/抽象類來實現。作用提高代碼靈活性,列入通過統一的接口處理多種對象類型,簡化邏輯設計。
  4. 抽象(Abstraction)【補充說明】:抽象常被視為面向對象的基礎概念,通過隱藏復雜的實現細節,只暴露必要的功能給用戶,抽象類和接口是實現抽象的重要工具,它定義了一組方法簽名,但不需要提供具體的實現。

題2.面向對象編程的優點

  1. 模塊化:代碼可用被分割成多個獨立的對象,便于維護和擴展。
  2. 可重用性:通過繼承和組合,代碼可以在不同的場景下重復使用。
  3. 可擴展性:新功能可以通過添加新的類和對象來實現,而不需要修改現有代碼。
  4. 易維護性:由于封裝的存在,代碼的內部實現可用隨時修改,而不會影響外部調用。

題3.簡述繼承的原則?

繼承是面向對象編程中的核心機制,其核心原則旨在確保代碼的健壯性、可維護性和靈活性。

繼承的主要原則:

  1. 里氏替換原則:子類必須能夠完全替換父類,且不影響程序的正確性。子類不應改變父類原有功能的行為,子類可以擴展父類的功能,但不可破壞父類對外的“契約”(如前置條件、后置條件、不變量)
  2. 組合優于繼承:優先使用組合(對象持有其他類的實例)而非繼承,以降低耦合度。當需要復用功能但不存在邏輯上的“is-a”關系時,需要運行時動態切換行為時
  3. 避免深度繼承層次:繼承層次不宜過深,否則會增加復雜性。通過組合、接口或設計模式(如裝飾器模式)替代多層次繼承,扁平化類結構,拆分為更小的職責單元。
  4. 單一職責原則:父類和子類都應該專注于單一職責。若父類承擔過多職責,子類可能被迫繼承冗余功能,需通過拆分父類解決。子類應僅擴展與自身職責相關的功能。
  5. 開閉原則:對擴展開放,對修改關閉。通過繼承擴展新功能(如子類添加新方法),而非修改父類現有代碼。父類應設計為可擴展(如使用抽象類或者虛方法)
  6. 明確的“is-a”關系:繼承應該嚴格表示邏輯上的“is-a”關系。反例:子類“企鵝”繼承了父類“鳥”,父類中存在“飛”方法,但是企鵝不會飛,則違反邏輯,需要重新設計
  7. 接口隔離原則:避免子類被迫依賴不需要的接口。若父類包含子類不需要的方法,應拆分父類為更小顆粒的接口或者抽象類。
  8. 合理使用抽象與封裝:父類應隱藏實現細節,僅暴露必要接口。父類通過“protected”或“public”方法提供擴展點,避免子類依賴內部狀態。子類應通過父類接口操作數據,而非直接訪問私有字段。

題4.列舉面向對象OOD訪問修飾符?

  1. public(公有):成員可以被任何類訪問。暴露類的核心功能或者接口,供外部直接調用。
  2. private(私有):成員僅能在“定義它的類內部”訪問,其他類無法直接訪問。隱藏實現細節,保護敏感數據或內部邏輯。
  3. protected(受保護):成員在“本類內部”、“同一包/命名空間的類”以及“子類”中可用訪問。支持繼承體系中的功能擴展,允許子類復用或重寫父類邏輯。
  4. internal:成員在同一程序集內可用訪問。

題5.簡述抽象類和接口的理解?

  1. 抽象類:抽象類是一種特殊的類,不能直接被實例化。抽象類可用包含抽象方法和普通方法,以及屬性和事件成員。其主要目的是作為其他類的基類,提供部分實現的功能和一些共享的屬性或方法。抽象類可以包含字段、構造函數、析構函數、靜態成員和常量等,但不能被密封
  2. 接口:接口是一種引用類型,也不能被實例化。接口定義了一組方法、屬性、事件或者索引器的契約,但不提供任何實現。接口主要是定義一組行為規范,這些行為規范可被任何實現該接口的類所共享。接口的成員(方法、屬性、事件)都是公開的,并且接口可用包含多個成員。
  3. 區別和聯系:(1)繼承限制:抽象類只能被一個類繼承,而接口可用被多個類實現。一個類可以有多個接口,但只能繼承一個抽象類(C#中不支持多繼承)。(2)成員類型:接口只能包含方法、屬性、事件和索引器的聲明,不能包含字段或已實現的方法;而抽象類可以包含這些成員。(3)用途:抽象類主要用于定義一系列緊密相關的類的共同特征和行為,而接口則用于定義一組不相關的類共同遵守的行為規范。接口通常用于定義松散的相關類,這些類實現某一功能。(4)接口中的成員默認是公開的,不能使用訪問修飾符;而抽象類中的成員可用有不同的訪問修飾符
  4. 實際應用場景:(1)抽象類:適用于那些需要被繼承的場景,特別是當子類需要共享父類的某些實現時。例如,定義一個動物作為抽象類,然后讓貓、狗等繼承這個抽象類,并實現各自的具體行為。(2)接口:適用于定義一組不相關的類需要遵守的行為規范。例如,定義一個飛行接口,讓鳥、飛機等實現這個接口代表他們都有飛行的能力

題6.死鎖的必要條件?怎么解決?

死鎖的必要條件包含下面四個:

  1. 互斥條件:資源只能被一個線程占用。例如,資源X和Y只能由一個線程持有。
  2. 請求并保持條件:一個線程持有A資源,同時等待B資源,而不釋放已占用的A資源。
  3. 不可剝奪條件:線程獲取的資源不能被強行剝奪,只能由線程自己釋放。
  4. 循環等待條件:多個線程形成環狀等待關系。例如A等B,B等C,C等A

解決死鎖的方法包括以下幾種:

  1. 預防死鎖:通過設置某些限定條件來破壞死鎖的四個必要條件中的一個或者多個,以確保系統不會進入不安全狀態。這種方法實現簡單,但可能導致系統資源的利用率和系統的吞吐量下降
  2. 避免死鎖:在為進程分配資源之前,采用特殊算法檢測并防止系統進入不安全狀態。這種方法不需要設定嚴格的限定條件,但需要預知資源需求,計算開銷較大。
  3. 檢測與解除死鎖:允許系統產生死鎖,但設置特定的檢測機構及時檢測并解除死鎖。這種方法資源利用率高,但恢復過程復雜。

避免死鎖的策略:

  1. 一次性申請所需要的資源:盡量一次性申請所需要的資源,而不是分次申請,以避免因持部分資源而產生等待。
  2. 允許線程主動釋放資源:允許線程在申請其他資源失敗時,主動釋放其已占有的資源,以減少死鎖發生的機會。
  3. 按序申請資源:為每個資源指定一個線性順序,線程在申請資源時必須按順序申請,先申請序號小的資源,后申請序號大的資源,以避免循環等待的情況

題7.接口是否可以繼承接口?抽象類是否可用實現接口?抽象類是否可用繼承實體類?

  1. 接口可以繼承接口:一個接口可以繼承一個或多個其他接口。這叫“接口繼承”。當一個接口繼承另外一個接口時,他繼承了父接口的所有成員(方法、屬性、事件、索引器)聲明,但是不繼承任何實現,因為接口本身沒有實現,子接口可用添加自己的新成員聲明。目的:擴展契約。子接口表示一種更具體或功能更豐富的契約,它包含了父接口的所有要求,并添加了新的要求
    interface IShape
    {double CalculateArea();void Draw();
    }abstract class AbstractShape : IShape
    {// 為 Draw 提供通用實現(假設所有形狀都用相同方式繪制輪廓)public void Draw(){Console.WriteLine("Drawing shape outline...");}// 將 CalculateArea 聲明為抽象,強制子類提供具體計算邏輯public abstract double CalculateArea();
    }class Circle : AbstractShape
    {public double Radius { get; set; }// 必須實現抽象基類 AbstractShape 要求的 CalculateAreapublic override double CalculateArea(){return Math.PI * Radius * Radius;}// Draw 方法已由 AbstractShape 實現,Circle 可以直接使用或選擇重寫(override)
    }
  2. 抽象類可以實現接口:抽象類可用聲明它實現一個或多個接口。實現方式:(1)提供具體實現:抽象類可用選擇為接口的所有成員提供具體的實現代碼。(2)將成員標記為抽象:抽象類可以將接口的成員聲明為abstract。這意味著抽象類本身不提供這些成員的具體實現,而是強制要求任何繼承該抽象類的非抽象具體子類必須提供這些實現。(3)混合實現:抽象類可用為部分接口成員提供具體實現,而將另外一些成員聲明為abstract,留給子類實現。目的:抽象類實現接口是為了定義與該契約相關的一部分通用行為(提供具體實現),同時強制子類完成契約的特定部分(通過抽象成員)。
    interface IShape
    {double CalculateArea();void Draw();
    }abstract class AbstractShape : IShape
    {// 為 Draw 提供通用實現(假設所有形狀都用相同方式繪制輪廓)public void Draw(){Console.WriteLine("Drawing shape outline...");}// 將 CalculateArea 聲明為抽象,強制子類提供具體計算邏輯public abstract double CalculateArea();
    }class Circle : AbstractShape
    {public double Radius { get; set; }// 必須實現抽象基類 AbstractShape 要求的 CalculateAreapublic override double CalculateArea(){return Math.PI * Radius * Radius;}// Draw 方法已由 AbstractShape 實現,Circle 可以直接使用或選擇重寫(override)
    }
  3. 抽象類可以繼承實體類:抽象類可以繼承自一個非抽象類(即具體類、實體類)。當抽象類繼承具體類時:(1)它繼承了該具體類的所有成員(字段、屬性、方法、事件等)。(2)他可以像普通派生類一樣添加新的成員(具體或抽象的)。(3)它不能重寫基類中非virtual或非abstract的方法(除非使用new關鍵字進行隱藏,但這通常不是好的實踐)。目的:復用基類(具體類)中已有的功能,并在此基礎上構建更抽象、更通用的概念。抽象類可用擴展基類的功能,同時定義一些需要子類實現的抽象操作。
    class Vehicle // 具體類(實體類)
    {public string Make { get; set; }public string Model { get; set; }public void StartEngine(){Console.WriteLine("Engine started.");}
    }abstract class FlyingVehicle : Vehicle // 抽象類繼承具體類 Vehicle
    {// 繼承自 Vehicle: Make, Model, StartEngine// 添加抽象成員,強制飛行器子類實現public abstract void TakeOff();public abstract void Land();// 可以添加新的具體成員public int MaxAltitude { get; set; }
    }class Helicopter : FlyingVehicle
    {// 必須實現 FlyingVehicle 的抽象方法public override void TakeOff() { Console.WriteLine("Helicopter taking off vertically."); }public override void Land() { Console.WriteLine("Helicopter landing vertically."); }// 繼承自 FlyingVehicle: MaxAltitude// 繼承自 Vehicle: Make, Model, StartEngine
    }

題8.簡述封裝具有的特性?

  1. 數據隱藏:將對象內部狀態(字段/屬性)設為private或protected。外部代碼不能直接訪問或修改對象的內部數據
  2. 訪問控制:通過公共方法(public methods)或屬性(properties)提供受控的訪問通道,可添加驗證邏輯確保數據有效性。
  3. 實現隔離:隱藏內部實現細節。外部只要知道“做什么”,無需知道“怎么做”
  4. 狀態完整性:確保對象始終處于有效狀態。通過封裝防止非法狀態轉換。
  5. 變更保護:內部實現修改不影響外部調用者。
  6. 模塊化:將相關數據和行為組織在獨立單元(類)中。降低系統復雜度,提高內聚性。

核心價值:

  1. 安全性:防止非法訪問和意外修改
  2. 靈活性:內部實現可自由變更
  3. 可維護性:錯誤局部化,便于調試
  4. 抽象簡化:降低使用復雜度

題9.簡述什么時候應用帶參構造函數?

  1. 強制初始化必要數據
  2. 依賴注入(DI)
  3. 創建不可變對象
  4. 參數驗證
  5. 簡化對象配置
  6. 繼承鏈初始化

關鍵選擇原則:

  1. 必需依賴:類正常工作必須的依賴項 → 使用帶參構造器強制提供
  2. 不變性要求:需要創建不可變對象時 → 通過構造器初始化只讀成員
  3. 強驗證需求:需要嚴格驗證初始狀態時 → 在構造器中實現驗證邏輯
  4. 明確依賴關系:遵循顯式依賴原則(Explicit Dependencies Principle)

最佳實踐:

當參數超過 3-4 個時,考慮使用?Builder 模式?或?參數對象?替代長參數列表:

// 使用參數對象
public class EmployeeConfig {public string Name { get; set; }public int Age { get; set; }public string Department { get; set; }
}public class Employee {public Employee(EmployeeConfig config) { ... }
}

題10.簡述內部類的好處?

  1. 增強封裝性:訪問私有成員:內部類可直接訪問外部類的?private?成員(字段、方法、屬性),無需通過公有接口暴露細節。隱藏實現:將只服務于外部類的輔助邏輯(如狀態管理、算法實現)隱藏在內部,減少命名空間污染。
    public class Outer {private int _secret = 42;// 內部類訪問外部類的私有成員private class Inner {public void RevealSecret(Outer outer) {Console.WriteLine(outer._secret); // 直接訪問私有字段}}
    }
  2. 邏輯分組與代碼組織:高內聚性:將緊密相關的類放在一起,提升代碼可讀性(如?Tree?類包含?TreeNode?內部類)。避免全局命名沖突:內部類名不會與全局類名沖突(如?Network.Packet?和?FileSystem.Packet?可共存)。
  3. 實現特定設計模式:工廠模式:外部類可通過內部類隱藏對象創建邏輯。迭代器模式:實現?IEnumerable?時常用內部類封裝迭代狀態(如?List<T>.Enumerator)。
    public class ProductFactory {public static IProduct Create() => new SecretProduct();private class SecretProduct : IProduct { ... } // 隱藏實現
    }
  4. 控制作用域與可見性:限制訪問權限:通過?private/protected?修飾符,嚴格限制內部類的使用范圍。減少耦合:外部代碼無法直接依賴內部類,降低系統復雜性。
    public class Database {// 僅Database類可訪問此連接器private class DbConnector { ... } 
    }
  5. 簡化事件處理(尤其GUI開發):在 WinForms/WPF 中,常用內部類處理 UI 組件的專屬事件,避免暴露回調邏輯。
    public class MainForm : Form {private Button _button;public MainForm() {_button = new Button();_button.Click += ButtonClickHandler;}// 事件處理邏輯封裝在內部類private class ButtonHandler {public static void OnClick(object sender, EventArgs e) { ... }}
    }
  6. 優化資源管理:實現?IDisposable?時,可通過內部類管理非托管資源,確保外部類簡潔。

題11.簡述內部類的作用?

  1. 隱藏實現細節
  2. 邏輯緊密關聯的輔助功能
  3. 特定模式(工廠、迭代器等)
  4. 受限作用域的場景

題12.解釋方法重載與重寫的區別?

在C#中,方法重載(Overloading)與方法重寫(Overriding)是兩種不同的多態性實現方式,主要區別如下:

  1. 方法重載(Overloading):定義:在同一個類中多個同名方法,方法參數列表必須不同(參數類型、數量、順序不同),與返回值類型無關(僅返回值不同不能構成重載)。
    public class OverloadingClass{public int Add(int a, int b)=>a+b;public int Add(int a,int b,int c)=>a+b+c;public double Add(double a,double b)=>a+b;
    }

    核心特點。編譯時多態:編譯器根據調用時的參數來決定執行哪個方法。靜態綁定:綁定發生在編譯階段。不需要繼承關系。使用場景:提供同一功能的多種不同的實現方式。

  2. 方法重寫(Overriding):定義:在子類中必須重新定義父類的方法。要求方法簽名完全一致(方法名、參數列表、返回類型)必須使用virtual(父類)和override(子類)關鍵字
    public class Animal {public virtual void MakeSound() => Console.WriteLine("Animal sound");
    }public class Dog : Animal {public override void MakeSound() => Console.WriteLine("Bark!");
    }

  3. 核心特點。運行時多態:根據對象實際類型決定執行哪個方法。綁定發生在運行時。重點:必須有繼承關系。使用場景:實現多態行為(如不同子類對同一方法的不同實現)

  4. 關鍵對比表

    特性方法重載 (Overloading)方法重寫 (Overriding)
    發生位置同一個類中子類中
    參數要求必須不同必須相同
    返回值可以不同必須相同
    綁定時機編譯時運行時
    繼承關系不需要必須存在
    關鍵字不需要virtual?+?override
    多態類型編譯時多態(靜態)運行時多態(動態)
  5. 易混淆點:重載-隱藏(new)
    //重寫示例 virtual+override
    public class Base {public virtual void Show() => Console.WriteLine("Base");
    }public class Derived : Base {// 方法隱藏(使用 new 關鍵字)public override void Show() => Console.WriteLine("Derived");
    }//隱藏示例 new
    public class Base {public void Show() => Console.WriteLine("Base");
    }public class Derived : Base {// 方法隱藏(使用 new 關鍵字)public new void Show() => Console.WriteLine("Derived");
    }

    隱藏(new字段):子類定義與父類同名方法(非重寫),父類方法不需要關鍵字virtual,通過父類引用調用時仍執行父類方法

  6. 總結:
    場景選擇
    同一類中提供不同參數實現重載(Overload)
    子類修改父類方法的行為重寫(Override)
    子類定義與父類同名的新方法隱藏(new)

    關鍵記憶點:

    • 重載 = 同類 + 不同參數

    • 重寫 = 子類 + 相同方法簽名 + 多態行為


題13.簡述接口隔離原則和單一原則如何理解?

在C#中,接口隔離原則(ISP)和單一職責原則(SRP)是SOLID設計原則的核心組成部分,它們的區別與聯系如下:

  1. 單一職責原則(SRP),核心思想:一個類只應有一個引用變化的,即:每個類/模塊只承擔一種職責。關鍵理解:(1)職責聚焦:類應該專注于單一功能(如:UserValidator只負責驗證,不負責存儲),避免“上帝類”(包含太多不相干的功能類)。(2)優勢:提高代碼可讀性、降低修改風險、簡化單元測試。
    // ? 違反 SRP:混合用戶操作和日志記錄
    public class UserService {public void AddUser(User user) {// 業務邏輯...LogToFile("User added"); // 職責混雜}
    }// ? 遵循 SRP:分離職責
    public class UserService {private readonly ILogger _logger;public void AddUser(User user) { /* 業務邏輯 */ }
    }public class FileLogger : ILogger { /* 專職責日志 */ }
  2. 接口隔離原則(ISP),核心思想:客戶端不應被迫依賴它不需要的接口方法,即:接口應小而專一,避免“胖接口”。關鍵理解:(1)接口粒度:將大接口拆分為多個小接口(如:IPrinter,IScanner代替IMultifunctionDevice),客戶端只需要實現與其相關的方法。(2)優勢:避免接口污染、提高系統靈活性、降低耦合度
  3. 原則對比表

    維度單一職責原則 (SRP)接口隔離原則 (ISP)
    作用對象類/模塊接口
    核心目標職責單一化接口最小化
    解決痛點功能混雜的"上帝類"強迫實現無用方法的"胖接口"
    典型場景拆分混合業務邏輯的類為不同客戶端提供定制接口
    代碼表現通過類分解實現通過接口拆分實現
    關系ISP 是 SRP 在接口層面的延伸SRP 是 ISP 的實現基礎
  4. 總結

    原則關鍵要點實踐口訣
    SRP一個類只做一件事"高內聚,低耦合"
    ISP按需提供接口,拒絕強制實現"接口要精細,客戶不背鍋"

    二者共同目標:
    🔹?減少副作用(修改一處不影響其他)
    🔹?提升可維護性(模塊化設計)
    🔹?增強擴展性(通過組合而非修改)


題14.解釋finally在什么時候使用?

在C#中,finally塊是異常處理機制(try-catch-finally)的核心組成部分,用于確保無論是否發生異常,特定代碼都會被執行。

finally的核心使用場景:

  • 資源清理:確保非托管資源(文件句柄、數據庫連接、網絡連接等)在任何情況下都能被釋放
    FileStream file = null;
    try {file = File.Open("data.txt", FileMode.Open);// 操作文件...
    }
    catch (IOException ex) {Console.WriteLine($"文件錯誤: {ex.Message}");
    }
    finally {file?.Close(); // 無論是否異常,確保文件關閉
    }
  • 狀態重置:確保關鍵狀態變量(如標志位、鎖狀態)總能被恢復
    bool isProcessing = true;
    try {// 執行關鍵操作...
    }
    finally {isProcessing = false; // 確保狀態重置
    }
  • 日志記錄:記錄操作完成狀態
    try {ProcessData();
    }
    finally {Log("數據處理操作已完成"); // 總會記錄
    }
  1. finally的執行特性:(1)必執行性:finally塊在以下流程中總會執行:try塊正常完成時、catch塊處理異常后、未捕獲的異常拋出前。(2)與return的交互:即使try/catch中存在return,finally仍會在return前執行。(3)異常覆蓋警告:若finally中拋出異常,會覆蓋原始異常。
    try {throw new Exception("測試異常");
    }
    finally {Console.WriteLine("finally 仍會執行!");
    }
    // 輸出:finally 仍會執行!
    // 隨后程序崩潰:未處理異常string Test() {try {return "try 返回值";}finally {Console.WriteLine("finally 執行");}
    }
    // 輸出:finally 執行
    // 返回:"try 返回值"try {throw new Exception("原始異常");
    }
    finally {throw new Exception("finally 異常"); // 此異常會覆蓋原始異常
    }
  2. 替代方案:using語句。對于實現了?IDisposable?的對象,優先使用?using(本質是?try-finally?的語法糖):

  3. finally不執行的特殊情況:程序強制終止、斷電或系統崩潰、無限循環阻塞、異步堆棧溢出
  4. 最佳實踐總結:
    場景推薦方式
    釋放非托管資源finally?或?using
    狀態重置/清理finally
    必須執行的收尾操作finally
    實現?IDisposable?的對象using(優先)

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/83963.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/83963.shtml
英文地址,請注明出處:http://en.pswp.cn/web/83963.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

二十一、【用戶管理與權限 - 篇三】角色管理:前端角色列表與 CRUD 實現

【用戶管理與權限 - 篇三】角色管理:前端角色列表與 CRUD 實現 前言準備工作第一部分:更新 API 服務以包含角色管理第二部分:添加角色管理頁面的路由和側邊欄入口第三部分:實現角色列表頁面第四部分:實現角色表單對話框組件第五部分:全面測試總結前言 一個完善的權限系統…

Objective-c protocol 練習

題目描述&#xff1a; 請使用 Objective-C 中的 protocol 協議機制&#xff0c;實現一個簡易的門禁控制系統。 系統包含兩個類&#xff1a; AccessControlSystem —— 門禁系統&#xff0c;用于執行開門操作&#xff1b;Admin —— 實現權限判斷邏輯的管理員。 要求如下&am…

科技創新賦能產業創新,雙輪驅動助力新疆高質量發展!

在新疆維吾爾自治區成立70周年之際&#xff0c;中國產學研合作促進會于6月14日在烏魯木齊舉辦“天山對話&#xff1a;推動新疆科技創新與產業創新”盛會。多位院士、專家、學者及企業代表齊聚一堂&#xff0c;探尋推動新疆科技創新和產業創新的新路徑、新動能。活動現場&#x…

C#最佳實踐:推薦使用 nameof 而非硬編碼名稱

C#最佳實踐:推薦使用 nameof 而非硬編碼名稱 在 C# 編程領域,代碼的可維護性、健壯性和可讀性是衡量程序質量的重要指標。在日常開發中,我們常常會遇到需要引用類型、成員或變量名稱的場景,比如在拋出異常時指定錯誤相關的變量名、在日志記錄中標記關鍵元素名稱等。傳統的…

vue3 iframe 跨域-通訊

一、基礎嵌套方法 直接在 HTML 中使用 <iframe> 標簽指定 src 屬性&#xff1a; <iframe src"https://目標網址.com" width"800" height"600"></iframe>?限制?&#xff1a;若目標網站設置了 X-Frame-Options 響應頭&#x…

Iceberg與Hive集成深度

一、Iceberg在Hive中的ACID事務實現與實戰 1.1 傳統Hive的事務局限性 Hive原生僅支持非事務表&#xff08;Non-ACID&#xff09;&#xff0c;存在以下痛點&#xff1a; 不支持行級更新/刪除并發寫入時數據一致性無法保證無事務回滾機制歷史版本查詢需手動實現 1.2 Iceberg為…

深入剖析 Celery:分布式異步任務處理的利器

本文在創作過程中借助 AI 工具輔助資料整理與內容優化。圖片來源網絡。 文章目錄 引言一、Celery 概述1.1 Celery 的定義和作用1.2 Celery 的應用場景 二、Celery 架構分析2.1 Celery 的整體架構2.2 消息中間件&#xff08;Broker&#xff09;2.3 任務隊列&#xff08;Task Que…

Flask應用中處理異步事件(后臺線程+事件循環)的方法(2)

在上一節&#xff0c;我們講述了最簡單最基礎的后線程的建立&#xff0c;現在我們將進行拓展 Flask應用中處理異步事件&#xff08;后臺線程事件循環&#xff09;的方法&#xff08;1&#xff09; 在我們的實際應用當中&#xff0c;我們需要定義三個東西 一個多線程的信號旗&am…

C++(面向對象編程)

思維導圖 面向對象 1.面向對象思想 概念&#xff1a;面向對象編程&#xff08;OOP&#xff09;是一種以對象為基礎的編程范式&#xff0c;強調將數據和操作數據的方法封裝在一起。這就是上篇文章講過的。面向過程是以“怎么解決問題”為核心&#xff0c;而面向對象思想在于“誰…

驅動程序無法通過使用安全套接字層(SSL)加密與 SQL Server 建立安全連接,

驅動程序無法通過使用安全套接字層(SSL)加密與 SQL Server 建立安全連接,Error: “The server selected protocol version TLS10 is not accepted by client preferences [TLS13&#xff0c;TLS12]”. ClientConnectionId:d5fd8d69-ae88-4055-9f6d-6e8515224ce2】。 基本上就是…

【三大前端語言之一】交互:JavaScript詳解

【三大前端語言之一】交互&#xff1a;JavaScript詳解 在學習完HTML和CSS之后&#xff0c;最后一門前端語言——JavaScript&#xff0c;是重中之重。HTML負責頁面結構&#xff0c;CSS負責頁面樣式&#xff0c;而JavaScript則賦予網頁“生命”&#xff0c;讓網頁可以動起來、響…

LangChain面試內容整理-知識點12:檢索器(Retriever)接口與實現

在LangChain中,檢索器(Retriever)是一個抽象接口,負責根據用戶查詢從數據源中檢索相關文檔。可以把Retriever理解為“搜索工具”:給它一個未經結構化的查詢文本(如用戶問題),它返回一組與之相關的 Document 對象。內部可以基于向量相似度、數據庫查詢、甚至網絡搜索。 …

LLVM前端和優化層

文章目錄 LLVM ArchitectueLLVM 前端Lexical Analysis詞法分析Syntactic analysis 語法分析Syntactic Analyze語義分析 LLVM 優化層Pass 基礎概念Pass 依賴關系Pass API 總結 LLVM Architectue LLVM 前端 LLVM 的前端其實是把源代碼也就是 C、C、Python 這些高級語言變為編譯器…

工作流和Agent 的區別與聯系

工作流和智能體可能讓人混淆的地方就是他們都可能有大模型的加持&#xff0c;都可能有工具的加入供大模型調用&#xff0c;本文做一下對比和聯系 工作流 (Workflow) 定義&#xff1a; 工作流是一系列預定義、結構化且可重復的步驟或任務&#xff0c;旨在完成特定的業務目標或解…

leetcode--用StringBulider反轉字符串單詞的巧妙解法

反轉字符串中的單詞 這道題理想中的操作方式就是先去除前導和尾隨空格&#xff0c;之后設一個尾指針&#xff0c;往前檢索&#xff0c;掃到一個單詞就把這個單詞放到字符串的第一個位置。 很明顯&#xff0c;java中我們不能直接對字符串進行修改&#xff0c;而我們想實現一個一…

連鎖零售行業智慧能源管理解決方案:精準管控,讓每一度電創造價值

在連鎖超市、便利店等業態中&#xff0c;門店分布廣、用能場景復雜、管理成本高是普遍難題。傳統能源管理模式依賴人工抄表與分散管理&#xff0c;存在數據滯后、響應效率低、安全隱患難排查等問題。以某全國幾千家門店的連鎖便利店為例&#xff0c;其面臨的挑戰包括&#xff1…

在 PostgreSQL 中實現 `lck`, `special`, `item` 與 `org_id` 或 `user_id` 組合唯一的約束

在 PostgreSQL 中實現 lck, special, item 與 org_id 或 user_id 組合唯一的約束 要實現 lck, special, item 這三個字段必須與 org_id 或 user_id 中的一個&#xff08;但不能同時&#xff09;組合唯一的約束&#xff0c;你需要創建以下約束&#xff1a; 方案1&#xff1a;使…

g++ a.cpp -o a ‘pkg-config --cflags --libs opencv4‘/usr/bin/ld: 找不到 沒有那個文件或目錄

這個錯誤表明 pkg-config 命令沒有正確執行&#xff0c;導致編譯器無法找到 OpenCV 的庫文件和頭文件路徑。pkg-config 是一個工具&#xff0c;用于查詢已安裝庫的編譯和鏈接選項。如果 pkg-config 無法找到 OpenCV 的配置文件&#xff0c;就會導致這個錯誤。 以下是解決這個問…

定制平板在智能家居中能做些什么?全面解析其核心功能

大家有沒有發現&#xff0c;現在智能家居越來越普及了&#xff0c;很多家庭都在逐步升級自己的居住體驗。而在這一過程中&#xff0c;一種設備正悄悄地取代我們以前常用的開關面板和手機APP&#xff0c;成為整個家庭智能控制的核心&#xff0c;這就是——定制平板。 它可不是我…

【通俗易懂】Linux 線程調度策略詳解

引言&#xff1a;CPU是廚房&#xff0c;調度器是主廚 要真正理解Linux如何處理成千上萬個并發任務&#xff0c;不妨把它想象成一個繁忙的專業廚房。這個比喻不僅能讓抽象概念變得具體&#xff0c;更能揭示其背后深刻的設計哲學。 廚房 (The Kitchen): 代表整個計算機系統。 廚…