.net?core中的System.Buffers命名空間
最近研究了一下.net core 2.1的基礎(chǔ)類庫,發(fā)現(xiàn)它引入了一個(gè)System.Buffers名字空間,里面提供了一系列比較實(shí)用的對(duì)象,便簡(jiǎn)單的管中窺豹瀏覽一下。
ArrayPool<T>
ArrayPool<T>是一個(gè)數(shù)組類型的對(duì)象池,本身ArrayPoo<T>是一個(gè)抽象類,但他有一個(gè)默認(rèn)的實(shí)現(xiàn)ArrayPoo<T>. Shared,使用方法如下:
var pool = ArrayPool<byte>.Shared;
var buffer = pool.Rent(2048);
try
{
//使用buffer
}
finally
{
pool.Return(buffer);
//歸還buffer后不要再使用
}方法比較簡(jiǎn)單:
- 通過Rent從對(duì)象池中申請(qǐng)buffer
- 使用完后,通過Return將buffer歸還至對(duì)象池
微軟的文檔上并沒有詳細(xì)描述默認(rèn)的ArrayPoo<T>的對(duì)象申請(qǐng)算法。
不過并不復(fù)雜,和傳統(tǒng)的對(duì)象池的維護(hù)方式也差不多:
- 系統(tǒng)維持著一個(gè)對(duì)象池
- 調(diào)用Rent的時(shí)候,首先會(huì)到對(duì)象池中查看是否有合適的對(duì)象(至少要滿足最小長(zhǎng)度),如果有則直接返回對(duì)象池中的對(duì)象,并將其從對(duì)象池中移除
- 調(diào)用Return時(shí),將對(duì)象放置到對(duì)象池,從而可以作為下次Rent的候選對(duì)象
注:這里只記錄了主要相關(guān)功能,實(shí)際算法比這個(gè)復(fù)雜。另外,由于沒有很詳細(xì)看實(shí)現(xiàn)方式,如要描述不正確的地方歡迎指正
也就是說,return后的對(duì)象,很可能被別的地方rent走,因此可能導(dǎo)致讀寫沖突。(類似于c語言中的野指針,但仍然是安全的,不會(huì)造成內(nèi)存錯(cuò)誤)
MemoryPool<T>
除了ArrayPool外,System.Buffers名字空間下還提供了一個(gè)MemoryPool,它的使用方式和ArraPool比較類似,基本示例如下:
var pool = MemoryPool<byte>.Shared;
var buffer = pool.Rent(2048);
try
{
var memory = buffer.Memory;
//use Memory<byte>
}
finally
{
buffer.Dispose();
}整個(gè)過程還是非常類似的,不過釋放的時(shí)候是調(diào)用的Dispose方法,用起來實(shí)際要更加方便點(diǎn)。不過這里申請(qǐng)到的是Memory<T>對(duì)象,可能有的地方不像byte[]那樣適用 。
關(guān)于MemoryPool的實(shí)現(xiàn),我在github上找了一下,還沒有看到。不過由于它返回的是Memory<T>,理論上來講應(yīng)該是有更高的效率。(例如,可以把一個(gè)大段的buffer分成多個(gè)memory返回,從而減少申請(qǐng)新對(duì)象)
BinaryPrimitives
BinaryPrimitives位于System.Buffers.Binary名字空間下,它提供了一系列數(shù)字和字節(jié)互相轉(zhuǎn)換的函數(shù)。

它的主要好處是是提供了常用BigEndian類型的數(shù)字的支持,在網(wǎng)絡(luò)編程或者文件解析的方式的時(shí)候非常實(shí)用,免得造輪子了。
Utf8Parser、Utf8Formatter和Base64
這三個(gè)類位于System.Buffers.Text下,它主要用于utf8編碼和base64編碼下的常用類型的讀寫,如datetime,guid,bool等,并且支持常用的序列化方式。。
到此這篇關(guān)于System.Buffers命名空間的文章就介紹到這了。希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
FileStreaReder和StreamReader兩個(gè)類介紹
由于最近需要對(duì)文件進(jìn)行處理,所以看了一下MSDN的System.IO讀取文件的兩個(gè)類。下面對(duì)兩個(gè)類簡(jiǎn)單的整理一下2012-04-04
.Net創(chuàng)建型設(shè)計(jì)模式之工廠方法模式(Factory?Method)
這篇文章介紹了.Net設(shè)計(jì)模式之工廠方法模式(Factory?Method),文中通過示例代碼介紹的非常詳細(xì)。對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-05-05
部署ASP.NET?Core程序到Windows系統(tǒng)
這篇文章介紹了部署ASP.NET?Core程序到Windows系統(tǒng)的方法,對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2022-03-03
通過VS中的數(shù)據(jù)源選擇對(duì)話框簡(jiǎn)單實(shí)現(xiàn)數(shù)據(jù)庫連接配置
通過VS中的數(shù)據(jù)源選擇對(duì)話框簡(jiǎn)單實(shí)現(xiàn)數(shù)據(jù)庫連接配置...2007-02-02
.NET?6更新使.NET生態(tài)系統(tǒng)蛻變
微軟正式發(fā)布.NET最新長(zhǎng)期支持版本.NET?6,這個(gè)版本的更新重點(diǎn),除了C#和F#都有許多語言功能改進(jìn)之外,.NET?6終于集大成,成為跨瀏覽器、云計(jì)算、桌面、物聯(lián)網(wǎng)和移動(dòng)應(yīng)用程序的統(tǒng)一平臺(tái),性能也獲得大幅提升,并且更完整支持Arm642022-01-01
ASP.Net?Core?MVC基礎(chǔ)系列之環(huán)境設(shè)置
這篇文章介紹了ASP.Net?Core?MVC環(huán)境設(shè)置的方法,文中通過示例代碼介紹的非常詳細(xì)。對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-02-02
.Net結(jié)構(gòu)型設(shè)計(jì)模式之享元模式(Flyweight)
這篇文章介紹了.Net結(jié)構(gòu)型設(shè)計(jì)模式之享元模式(Flyweight),文中通過示例代碼介紹的非常詳細(xì)。對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-05-05
利用C#遠(yuǎn)程存取Access數(shù)據(jù)庫
目前,基于數(shù)據(jù)庫服務(wù)器的桌面管理程序和Web程序已經(jīng)有太多的應(yīng)用了,尤其是網(wǎng)絡(luò)的大量普及,孤立地?cái)?shù)據(jù)庫管理系統(tǒng)無法勝任分布式管理應(yīng)用,但是面對(duì)基于Access數(shù)據(jù)庫的現(xiàn)有的桌面應(yīng)用我們也無法完全的摒棄。我們利用.Net 遠(yuǎn)程處理功能將連接和存取Access的行為封裝為一個(gè)遠(yuǎn)程對(duì)象,供網(wǎng)絡(luò)中其它客戶端通過調(diào)用該遠(yuǎn)程對(duì)象來存取實(shí)際的Access數(shù)據(jù)庫。我們以 C# 2005 為開發(fā)語言來實(shí)現(xiàn)上述功能。2008-04-04

