- NET Core平臺(tái)與.net framework相比有哪些優(yōu)勢?
.NET Core和.NET Framework都是用于構(gòu)建Windows和Web應(yīng)用程序的跨平臺(tái)框架。
.NET Core是開源的,跨平臺(tái)的,它可以在Windows,macOS,Linux等操作系統(tǒng)上運(yùn)行。
而.NET Framework只能運(yùn)行在Windows系統(tǒng)上。
優(yōu)點(diǎn):.NET Core具有更小的文件大小、更快的啟動(dòng)時(shí)間和更好的性能表現(xiàn),同時(shí)還可以使用新的C#語言功能。 - 談?wù)勀銓σ蕾囎⑷氲牧私?/strong>
依賴注入(Dependency Injection,簡稱DI)是一種軟件設(shè)計(jì)模式,旨在實(shí)現(xiàn)控制反轉(zhuǎn)(Inversion of Control, IoC),
從而促進(jìn)代碼的解耦和可維護(hù)性。在依賴注入中,一個(gè)對象的依賴關(guān)系由外部系統(tǒng)或容器管理,而非對象自身創(chuàng)建其依賴對象。
這樣做的目的是讓對象專注于執(zhí)行其核心職責(zé),而將依賴管理的任務(wù)交給外部系統(tǒng),例如依賴注入容器。 具體來說,依賴注入涉及以下幾個(gè)關(guān)鍵概念: 依賴:當(dāng)一個(gè)類A使用另一個(gè)類B的方法或?qū)傩詴r(shí),A依賴于B。 注入:將一個(gè)對象傳遞到另一個(gè)對象的方法或構(gòu)造函數(shù)中的過程,即注入。 依賴注入可以通過多種方式實(shí)現(xiàn),包括但不限于: 構(gòu)造器注入:在對象的構(gòu)造函數(shù)中注入依賴。 方法注入:通過對象的方法參數(shù)傳遞依賴。 屬性注入:通過對象的屬性設(shè)置依賴。 - .NET CROE 內(nèi)置依賴注入的三種生命周期:
1、Transient(瞬時(shí)):即用即建,用后即棄。就是每次獲取這個(gè)服務(wù)的實(shí)例時(shí)都要?jiǎng)?chuàng)建一個(gè)這個(gè)服務(wù)的實(shí)例。 2、Scoped(作用域):這種類型的服務(wù)實(shí)例保存在當(dāng)前依賴注入容器(IServiceProvider)上。在同作用域,服務(wù)每個(gè)請求只創(chuàng)建一次。 3、Singleton(單例):服務(wù)請求時(shí)只創(chuàng)建實(shí)例化一次,其后相同請求都延用這個(gè)服務(wù)。
- 請簡述.NET Core中的中間件(Middleware)的作用及其使用方法。
中間件(Middleware)是.NET Core中的一種特殊組件,它可以處理HTTP請求和響應(yīng),并把請求傳遞到下一個(gè)中間件或終止請求。 中間件在ASP.NET應(yīng)用程序中扮演著非常重要的角色,能夠?yàn)閼?yīng)用程序提供豐富的功能和服務(wù),例如路由、認(rèn)證、授權(quán)、緩存、日志、異常處理等。 使用中間件在.NET Core應(yīng)用程序中添加組件或服務(wù)非常簡單 ASP.NET Core加載中間件的順序與它們添加到中間件管道的順序相同, 因此可以按照需要添加中間件并調(diào)整它們的順序。 - 你在項(xiàng)目中使用過哪些ORM框架?EF Code和sqlsugar在項(xiàng)目中使用得多嗎?
SqlSugar是一款 老牌 .NET開源ORM框架 1. 真正可以實(shí)現(xiàn)零SQL的ORM 建表、索引和CRUD全部支持 2. 支持 .NET 百萬級大數(shù)據(jù)寫入、更新、分表和擁有幾十億查詢統(tǒng)計(jì)成熟解決方案 3. 支持 SAAS 完整應(yīng)用 :跨庫查詢 、審計(jì)、租戶分庫 、租戶分表 和 租戶數(shù)據(jù)隔離 4. 支持低代碼+工作流 (動(dòng)態(tài)建類 、動(dòng)態(tài)建表、無實(shí)體多庫兼容CRUD 、 JSON TO SQL 、自定義XML等) 5. 支持ValueObject、鑒別器、倉儲(chǔ)、UnitOfWork、DbContext、AOP 6. 支持 DbFirst、CodeFirst和WebFirst 3種模式開發(fā) 7. 簡單易用、功能齊全、高性能、輕量級、服務(wù)齊全、官網(wǎng)教程文檔
- 反射(Reflection)在.NET中的使用場景?
反射(Reflection)在.NET中提供了一種動(dòng)態(tài)地獲取和操作類型信息的能力。通過反射,我們可以在運(yùn)行時(shí)獲取類型的成員(屬性、方法、字段等)信息,
并進(jìn)行動(dòng)態(tài)創(chuàng)建對象、調(diào)用方法、訪問和修改屬性等操作。下面是一些常見的使用場景: 1)插件和擴(kuò)展性:通過反射,可以在運(yùn)行時(shí)加載和實(shí)例化程序集中的類型,實(shí)現(xiàn)插件化和動(dòng)態(tài)擴(kuò)展的功能。
這樣,我們可以在不修改代碼的情況下,動(dòng)態(tài)地添加新的功能和模塊。 2)配置和元數(shù)據(jù)處理:通過反射,可以讀取和處理程序集、類型和成員的元數(shù)據(jù)信息,如屬性的注解、方法的參數(shù)信息等。
這使得我們可以實(shí)現(xiàn)基于配置文件的動(dòng)態(tài)配置和元數(shù)據(jù)驅(qū)動(dòng)的開發(fā)。 3)反射性能優(yōu)化:通過反射,可以動(dòng)態(tài)地生成和編譯代碼,從而提高代碼的性能。
例如,使用反射 Emit 或 Expression Tree 可以動(dòng)態(tài)生成 IL 代碼,實(shí)現(xiàn)高性能的動(dòng)態(tài)代理、表達(dá)式解析和編譯等。 4)序列化和反序列化:反射可以在序列化和反序列化過程中使用,通過讀取對象的成員信息,將對象轉(zhuǎn)換為字節(jié)流或?qū)⒆止?jié)流轉(zhuǎn)換回對象。 5)調(diào)試和測試:在調(diào)試和測試過程中,反射可以幫助我們動(dòng)態(tài)地獲取對象的內(nèi)部狀態(tài)和調(diào)用私有方法,以便進(jìn)行更詳細(xì)的分析和測試。 6)動(dòng)態(tài)代碼生成和動(dòng)態(tài)代理:通過反射,可以在運(yùn)行時(shí)動(dòng)態(tài)生成代碼,并創(chuàng)建動(dòng)態(tài)代理對象。這在某些情況下非常有用,如 AOP(面向切面編程)和遠(yuǎn)程代理等。 - 請解釋.NET中的垃圾回收(GC)機(jī)制,以及它對內(nèi)存管理的影響。
在.NET中,垃圾回收(GC)是一種自動(dòng)的內(nèi)存管理機(jī)制,它負(fù)責(zé)管理.NET應(yīng)用程序中的內(nèi)存分配和釋放。
垃圾回收器在運(yùn)行時(shí)自動(dòng)識(shí)別和回收不再使用的內(nèi)存對象,以便釋放內(nèi)存并減少內(nèi)存泄漏的風(fēng)險(xiǎn)。 - 使用過ABP框架嗎?知道DDD設(shè)計(jì)模式嗎?并用你的理解講講它。
ABP(http://ASP.NET Boilerplate)是一個(gè)流行的開源應(yīng)用程序框架,用于構(gòu)建跨平臺(tái)的企業(yè)級應(yīng)用程序。
它基于http://ASP.NET Core,并提供了一套豐富的開發(fā)工具和模塊化組件,用于快速開發(fā)可擴(kuò)展、可測試和可維護(hù)的應(yīng)用程序。 DDD(Domain-Driven Design,領(lǐng)域驅(qū)動(dòng)設(shè)計(jì))是一種軟件開發(fā)方法論,強(qiáng)調(diào)將業(yè)務(wù)領(lǐng)域的專業(yè)知識(shí)融入到軟件設(shè)計(jì)和開發(fā)中 。DDD關(guān)注于解決復(fù)雜業(yè)務(wù)問題,并將業(yè)務(wù)邏輯和領(lǐng)域模型置于核心地位。 在ABP框架中,它借鑒了DDD設(shè)計(jì)模式的一些核心概念和原則,以幫助開發(fā)者構(gòu)建符合領(lǐng)域驅(qū)動(dòng)設(shè)計(jì)的應(yīng)用程序。 以下是我對DDD設(shè)計(jì)模式的理解:
1)領(lǐng)域:領(lǐng)域是指業(yè)務(wù)問題所涉及的特定領(lǐng)域,如電子商務(wù)、銀行業(yè)務(wù)等。
在DDD中,將業(yè)務(wù)領(lǐng)域抽象成領(lǐng)域模型。
2)領(lǐng)域模型:領(lǐng)域模型是對業(yè)務(wù)領(lǐng)域的抽象和建模,它包含了業(yè)務(wù)實(shí)體、值對象、聚合根、領(lǐng)域服務(wù)等概念。
領(lǐng)域模型通過對象和行為的組合來描述業(yè)務(wù)邏輯和規(guī)則。
3)聚合根:聚合根是領(lǐng)域模型中的重要概念,它是一組相關(guān)對象的根實(shí)體,用于保證數(shù)據(jù)的一致性和完整性。
聚合根通過封裝一組對象和定義一些約束來管理領(lǐng)域模型中的業(yè)務(wù)邏輯。
4)領(lǐng)域服務(wù):領(lǐng)域服務(wù)是一些不屬于任何特定實(shí)體的操作或行為,它處理領(lǐng)域模型中的復(fù)雜業(yè)務(wù)邏輯,提供一些跨實(shí)體的操作。
5)值對象:值對象是不可變的對象,它表示一些具體的屬性或?qū)傩约稀V祵ο鬀]有唯一標(biāo)識(shí),主要用于封裝和傳遞數(shù)據(jù)。
6)聚合和聚合邊界:聚合是一組相關(guān)對象的集合,它們共同構(gòu)成一個(gè)單元,具有邊界和一致性。
聚合邊界定義了聚合的邊界范圍,用于保證聚合內(nèi)部的一致性和完整性。 - 你有過系統(tǒng)的性能調(diào)優(yōu)的經(jīng)驗(yàn)嗎?列舉你在項(xiàng)目中的調(diào)優(yōu)的案例
1.利用數(shù)據(jù)庫事務(wù)批量提交 使用更高效的數(shù)據(jù)結(jié)構(gòu)和算法。 使用緩存避免多次數(shù)據(jù)庫交互 減少不必要的計(jì)算和內(nèi)存分配。 利用并行和異步編程提高性能。 使用性能分析工具定位和優(yōu)化瓶頸。 Web API方面: 使用HTTP緩存減少不必要的請求。 使用Gzip或Brotli壓縮減少響應(yīng)大小。 使用分頁、排序和過濾減少返回的數(shù)據(jù)量。 數(shù)據(jù)庫方面: 使用索引加速查詢。 使用批量操作減少數(shù)據(jù)庫交互次數(shù)。 使用讀寫分離和數(shù)據(jù)庫分片提高并發(fā)性能。 Nginx方面: 使用反向代理和負(fù)載均衡提高并發(fā)性能。 使用緩存減少后端服務(wù)器的負(fù)載。 使用Gzip壓縮減少網(wǎng)絡(luò)傳輸量。
- 請解釋緩存(Cache)的作用和優(yōu)勢,以及你在項(xiàng)目中如何使用緩存進(jìn)行性能優(yōu)化?
緩存(Cache)是一種臨時(shí)存儲(chǔ)數(shù)據(jù)的機(jī)制,將計(jì)算或獲取的數(shù)據(jù)存儲(chǔ)在高速訪問的介質(zhì)中,以便在后續(xù)訪問中能夠快速獲取并提供響應(yīng)。
緩存的作用是提高系統(tǒng)的性能和響應(yīng)速度,減輕對底層數(shù)據(jù)源的訪問壓力。在項(xiàng)目中使用緩存進(jìn)行性能優(yōu)化時(shí),可以采取以下策略:
1)查詢結(jié)果緩存:對于頻繁查詢且結(jié)果不經(jīng)常變動(dòng)的數(shù)據(jù),將查詢結(jié)果緩存起來,下次需要同樣的查詢結(jié)果時(shí)直接從緩存中獲取,減少數(shù)據(jù)庫的訪問。
2)頁面緩存:對于經(jīng)常被訪問的頁面,將其渲染結(jié)果緩存起來,在后續(xù)請求中直接返回緩存的頁面,減少服務(wù)器的計(jì)算和渲染時(shí)間。
3)數(shù)據(jù)緩存:對于經(jīng)常被讀取的數(shù)據(jù),如配置信息、靜態(tài)數(shù)據(jù)等,將其緩存在內(nèi)存中,減少對數(shù)據(jù)源的訪問。
4)查詢緩存:對于復(fù)雜且耗時(shí)的查詢,將查詢語句和結(jié)果緩存起來,下次相同的查詢可以直接返回緩存的結(jié)果,避免重復(fù)計(jì)算。
5)分布式緩存:對于分布式系統(tǒng),使用分布式緩存可以將數(shù)據(jù)存儲(chǔ)在多個(gè)節(jié)點(diǎn)上,提高緩存的容量和可靠性。
需要注意的是,緩存的使用需要考慮緩存數(shù)據(jù)的一致性和過期策略,避免緩存數(shù)據(jù)過期導(dǎo)致的數(shù)據(jù)不一致性問題。
可以根據(jù)業(yè)務(wù)需求和數(shù)據(jù)特性來確定合適的緩存策略和緩存更新機(jī)制。 - 請列舉你熟悉的前端框架和你在項(xiàng)目中使用它們的經(jīng)驗(yàn)。
Vue 的三種傳值方式 父傳子:可以通過 V-bind 動(dòng)態(tài) 綁定需要傳的值 子傳父:通過 this.$emit("事件名A",傳的值) 兄弟之間傳值:非父子組件之間傳值,需要定義個(gè)公共的公共實(shí)例文件bus.js,作為中間倉庫來傳值,不然路由組件之間達(dá)不到傳值的效果。
- 請講講Mvvm模式?
MVVM(Model-View-ViewModel)是一種軟件架構(gòu)模式,用于在應(yīng)用程序中實(shí)現(xiàn)數(shù)據(jù)、界面和業(yè)務(wù)邏輯的分離。
MVVM模式由以下三個(gè)主要組件組成:
Model(模型):模型代表應(yīng)用程序的數(shù)據(jù)和業(yè)務(wù)邏輯。它包含了數(shù)據(jù)的獲取、存儲(chǔ)和處理的方法,以及與數(shù)據(jù)相關(guān)的業(yè)務(wù)規(guī)則。
View(視圖):視圖是用戶界面的可視部分。它負(fù)責(zé)展示數(shù)據(jù)和與用戶進(jìn)行交互。在MVVM模式中,視圖是被動(dòng)的,它只負(fù)責(zé)顯示數(shù)據(jù)和轉(zhuǎn)發(fā)用戶輸入到ViewModel。
ViewModel(視圖模型):視圖模型是連接模型和視圖的中間層。它包含了視圖所需的數(shù)據(jù)和命令,并提供了與視圖交互的方法。
視圖模型將模型中的數(shù)據(jù)適配為視圖所需的形式,并將用戶的操作轉(zhuǎn)化為模型的操作。 - 講講你使用過的設(shè)計(jì)模式,并詳解某個(gè)你熟悉的設(shè)計(jì)模式?
單例模式:通過單例模式可以保證系統(tǒng)中,應(yīng)用該模式的類一個(gè)類只有一個(gè)實(shí)例。即一個(gè)類只有一個(gè)對象實(shí)例。 工廠模式(Factory Method)是軟件設(shè)計(jì)中的一種創(chuàng)建型模式,其本質(zhì)在于將對象的創(chuàng)建過程與使用過程分離,
通過定義一個(gè)接口或抽象類來讓子類決定實(shí)例化哪一個(gè)類。 -
簡述 Func與Action的區(qū)別?
Func<T> 是一個(gè)委托類型,返回一個(gè)值。可以有0個(gè)或多個(gè)輸入?yún)?shù),并返回一個(gè)結(jié)果。
例如:Func<int, int, int>表示一個(gè)有兩個(gè)int輸入?yún)?shù)并返回一個(gè)int結(jié)果的委托。 Action<T> 是一個(gè)委托類型,不返回值。可以有0個(gè)或多個(gè)輸入?yún)?shù)。
例如:Action<int, string>表示一個(gè)有兩個(gè)輸入?yún)?shù)(int和string)且不返回值的委托。 - C#中委托是什么?事件是不是委托?事件和委托的關(guān)系
委托是一個(gè)類,將方法當(dāng)作參數(shù)傳入另一個(gè)方法的參數(shù)。委托的使用需要先聲明,后實(shí)例化。接受一個(gè)將委托方法作為參數(shù)的構(gòu)造函數(shù)。
.net中有很多常見的委托如:Func 、Action 作用:提高方法的擴(kuò)展性
Func和Action委托的唯一區(qū)別在于Func要有返回值, Action沒有返回值。事件是特殊的委托,用于消息機(jī)制。
Action是無返回值的泛型委托,可以接受0個(gè)至16個(gè)傳入?yún)?shù) Action 表示無參,無返回值的委托
Func是有返回值的泛型委托,
可以接受0個(gè)至16個(gè)傳入?yún)?shù) Func 表示無參,返回值為int的委托 Func<object,string,int> 表示傳入?yún)?shù)為object, string 返回值為int的委托 - 接口和類有什么區(qū)別?抽象和虛擬有什么區(qū)別
接口定義功能,類實(shí)現(xiàn)功能。抽象函數(shù)只能在抽象類中聲明;虛擬函數(shù)可以有實(shí)現(xiàn)。
- string和stringBuilder的區(qū)別
string是不可變的引用類型;stringBuilder可變,適合頻繁修改字符串。
- 請描述socket進(jìn)行同步通訊編程的詳細(xì)步驟
服務(wù)端:創(chuàng)建Socket,綁定EndPoint,監(jiān)聽,接受連接,通信后關(guān)閉。 客戶端:創(chuàng)建Socket,連接EndPoint,發(fā)送和接收信息,通信后關(guān)閉。 - 介紹post和get的區(qū)別
get提交顯示在URL中,安全性低,數(shù)據(jù)量小;post提交隱藏在報(bào)文體中,安全性高,數(shù)據(jù)量大。
-
為什么C#使用反射比較慢?
反射的核心在于它提供了一種動(dòng)態(tài)類型信息訪問機(jī)制。在運(yùn)行時(shí),反射允許程序查看和操控對象的元數(shù)據(jù)。
這種動(dòng)態(tài)行為雖然帶來了極大的靈活性,但也意味著必須在運(yùn)行時(shí)進(jìn)行大量的類型檢查和信息檢索,這與編譯時(shí)的靜態(tài)類型檢查相比,開銷更大。 反射調(diào)用不能充分利用 .NET 的 JIT(Just-In-Time)優(yōu)化機(jī)制。JIT 編譯器在運(yùn)行時(shí)會(huì)對代碼進(jìn)行優(yōu)化,
例如內(nèi)聯(lián)、循環(huán)展開等。然而,由于反射調(diào)用是動(dòng)態(tài)的,JIT 編譯器無法在編譯時(shí)進(jìn)行這些優(yōu)化,從而導(dǎo)致反射調(diào)用的性能較低。 反射調(diào)用方法時(shí),參數(shù)通常需要進(jìn)行裝箱和拆箱操作。裝箱是將值類型轉(zhuǎn)換為引用類型的過程,而拆箱則是將引用類型轉(zhuǎn)換回值類型。
這些操作不僅增加了額外的性能開銷,還會(huì)導(dǎo)致垃圾回收頻率的增加,進(jìn)一步影響應(yīng)用性能。 反射在調(diào)用方法時(shí),會(huì)從方法數(shù)組中遍歷查找匹配的方法。這種遍歷查找過程會(huì)增加額外的時(shí)間開銷,
尤其是在類型包含大量方法的情況下,查找過程會(huì)更加耗時(shí)。 每次使用反射調(diào)用方法時(shí),運(yùn)行時(shí)都需要檢查是否允許訪問該方法。
這涉及到安全權(quán)限的驗(yàn)證,確保調(diào)用者具有訪問目標(biāo)方法的權(quán)限。雖然這些檢查是必要的以保證安全性,但也增加了額外的性能開銷。 -
C#中有哪些最常用的集合類型
在.NET中,集合類型有很多種,如哈希表、隊(duì)列、堆棧、字典和列表。 不同的集合類型適用于不同的應(yīng)用場景。 集合是用來存儲(chǔ)和管理一組相關(guān)數(shù)據(jù)的對象。 它們提供了一種動(dòng)態(tài)管理數(shù)據(jù)的方式,允許數(shù)據(jù)的添加、刪除和訪問。 C# 中的集合類型基于一組通用的接口,這些接口定義了集合的基本操作,如添加、刪除、枚舉和查詢等。 ICollection 和 ICollection接口 在 .NET 中,所有集合都直接或間接地基于 ICollection 或 ICollection<T> 接口。ICollection 接口定義了非泛型集合的大小、枚舉和同步方法。 IList 和 IList接口 IList 和 IList<T> 接口繼承自 ICollection 和 ICollection<T>, 并添加了根據(jù)索引訪問元素的方法。它們表示元素的有序集合, 可以通過索引訪問集合中的元素。 IDictionary 和 IDictionary接口 IDictionary 和 IDictionary<T> 接口繼承自 ICollection 和 ICollection<T>, 并添加了鍵值對集合的方法。 它們表示具有鍵值對的集合,其中鍵是唯一的,值可以通過鍵進(jìn)行訪問。
-
ASP.NET Core Web API上傳多個(gè)文件和JSON數(shù)據(jù)的方法
1、使用自定義包裝類接收上傳的文件及JSON數(shù)據(jù) 2、使用ModelBinderAttribute標(biāo)簽實(shí)現(xiàn) 3、用Postman測試
- .NET異步有多少種實(shí)現(xiàn)方式
NET提供的執(zhí)行異步操作的有三種模式 基于任務(wù)的異步模式 (TAP) 基于事件的異步模式(EAP) 基于異步編程模型 (APM) 實(shí)現(xiàn)異步的方法有四種 異步方法(Async Method TAP模式):使用async/await關(guān)鍵字實(shí)現(xiàn)異步編程 任務(wù)并行庫(TPL, Task Parallel Library TAP模式)通過 Task 和 Task類型實(shí)現(xiàn)異步編程,可以利用多核處理器,并發(fā)執(zhí)行多個(gè)獨(dú)立的任務(wù)。 Asynchronous Programming Model(APM模式)是一種經(jīng)典的異步編程模式,需要手動(dòng)創(chuàng)建回調(diào)函數(shù),用于處理完成或錯(cuò)誤的通知。
可以通過 IAsyncResult 設(shè)計(jì)模式的 Begin 和 End 方法來實(shí)現(xiàn),其中 Begin 方法開始異步操作,而 End 方法在異步操作完成時(shí)執(zhí)行,
并返回異步操作的結(jié)果。 Event-based Asynchronous Pattern(EAP模式)是一種已過時(shí)的異步編程模式,需要使用事件來實(shí)現(xiàn)異步編程。 -
描述線程與進(jìn)程的區(qū)別?
線程(Thread)與進(jìn)程(Process)二者都定義了某種邊界,不同的是進(jìn)程定義的是應(yīng)用程序與應(yīng)用程序之間的邊界,
不同的進(jìn)程之間不能共享代碼和數(shù)據(jù)空間,而線程定義的是代碼執(zhí)行堆棧和執(zhí)行上下文的邊界。
一個(gè)進(jìn)程可以包括若干個(gè)線程,同時(shí)創(chuàng)建多個(gè)線程來完成某項(xiàng)任務(wù),便是多線程。
而同一進(jìn)程中的不同線程共享代碼和數(shù)據(jù)空間。用一個(gè)比喻來說,如果一個(gè)家庭代表一個(gè)進(jìn)程,在家庭內(nèi)部,各個(gè)成員就是線程,
家庭中的每個(gè)成員都有義務(wù)對家庭的財(cái)富進(jìn)行積累,同時(shí)也有權(quán)利對家庭財(cái)富進(jìn)行消費(fèi),
當(dāng)面對一個(gè)任務(wù)的時(shí)候,家庭也可以派出幾個(gè)成員來協(xié)同完成,而家庭之外的人則沒有辦法直接消費(fèi)不屬于自己家庭的財(cái)產(chǎn)。 -
using關(guān)鍵字有什么用?跟IDisposable有啥關(guān)系?
using可以聲明namespace的引入,還可以實(shí)現(xiàn)非托管資源的釋放,實(shí)現(xiàn)了IDisposiable的類在using中創(chuàng)建,
using結(jié)束后會(huì)自動(dòng)調(diào)用該對象的Dispose方法,釋放資源。
加分的補(bǔ)充回答:using其實(shí)等價(jià)于try……finally,用起來更方便。 -
前臺(tái)線程和后臺(tái)線程有什么區(qū)別?
通過將 Thread.IsBackground 屬性設(shè)置為 true,就可以將線程指定為后臺(tái)線程 托管線程可以是后臺(tái)線程,也可以是前臺(tái)線程。 后臺(tái)線程和前臺(tái)線程幾乎完全相同,只有一處不同,即后臺(tái)線程不會(huì)確保托管執(zhí)行環(huán)境一直運(yùn)行。 一旦托管進(jìn)程(其中 .exe 文件為托管程序集)中的所有前臺(tái)線程都停止,系統(tǒng)會(huì)停止并關(guān)閉所有后臺(tái)線程。 前臺(tái)線程:應(yīng)用必須結(jié)束掉所有的前臺(tái)線程才能結(jié)束程序, 只要有一個(gè)前臺(tái)線程沒退出進(jìn)程就不會(huì)自動(dòng)退出, 當(dāng)然線程是依附在進(jìn)程上的, 所以你直接把進(jìn)程KO掉了的話自然所有前臺(tái)線程也會(huì)退出。 后臺(tái)線程:進(jìn)程可以不考慮后臺(tái)直接自動(dòng)退出, 進(jìn)程自動(dòng)退出后所有的后臺(tái)線程也會(huì)自動(dòng)銷毀。
-
await的作用和原理,并說明和GetResult()有什么區(qū)別?
async 關(guān)鍵字 ?定義異步方法:在方法前加上 async 關(guān)鍵字,表示該方法是異步的,可以包含 await 表達(dá)式。 返回類型:async 方法通常返回一個(gè)任務(wù)(Task 或 Task),表示異步操作的結(jié)果。對于不返回值的異步方法,返回類型是 Task;
對于返回值的異步方法,返回類型是 Task<T>。 await 關(guān)鍵字 ?等待異步操作:await 關(guān)鍵字用于等待一個(gè)異步操作完成。它會(huì)暫停方法的執(zhí)行,直到異步操作完成,然后繼續(xù)執(zhí)行方法的剩余部分。 ?釋放線程:在等待異步操作完成時(shí),await 會(huì)釋放當(dāng)前線程,使其可以執(zhí)行其他任務(wù),從而提高應(yīng)用程序的并發(fā)性能。 -
說說常用的鎖,lock是一種什么樣的鎖?
常用的如如SemaphoreSlim、ManualResetEventSlim、Monitor、ReadWriteLockSlim,lock是一個(gè)混合鎖,其實(shí)質(zhì)是Monitor
-
lock為什么要鎖定一個(gè)參數(shù)(可否為值類型?)參數(shù)有什么要求?
lock的鎖對象要求為一個(gè)引用類型。她可以鎖定值類型,但值類型會(huì)被裝箱,每次裝箱后的對象都不一樣,會(huì)導(dǎo)致鎖定無效。 對于lock鎖,鎖定的這個(gè)對象參數(shù)才是關(guān)鍵,這個(gè)參數(shù)的同步索引塊指針會(huì)指向一個(gè)真正的鎖(同步塊),這個(gè)鎖(同步塊)會(huì)被復(fù)用。 - 描述使用linq實(shí)現(xiàn)兩個(gè)對象集合左連接?
在使用LINQ(Language Integrated Query)實(shí)現(xiàn)兩個(gè)對象集合的左連接時(shí),可以使用join關(guān)鍵字和into子句來實(shí)現(xiàn)。
浙公網(wǎng)安備 33010602011771號