緩衝區
是內存中的一組字節序列,緩衝
是用來處理落在內存中的數據,.NET 緩衝
指的是處理 非託管內存
中的數據,用 byte[]
來表示。html
當你想把數據寫入到內存或者你想處理非託管內存中的數據,可使用 .NET 提供的 System.Buffer
類,這篇文章就來討論如何使用 Buffer。git
Buffer 類包含了下面幾個方法:github
用於將指定位置開始的 原數組 copy 到 指定位置開始的 目標數組。segmentfault
表示數組中 byte 字節的總數。數組
在數組一個指定位置中提取出一個 byte。性能
在數組的一個指定位置中設置一個 byte。url
從第一個源地址上copy 若干個byte 到 目標地址中。spa
在瞭解 Buffer 以前,咱們先看看 Array 類,Array 類中有一個 Copy()
方法用於將數組的內容 copy 到另外一個數組中,在 Buffer 中也提供了一個相似的 BlockCopy()
方法和 Array.Copy()
作的同樣的事情,不過 Buffer.BlockCopy()
要比 Array.Copy()
的性能高得多,緣由在於前者是按照 byte 拷貝,後者是 content 拷貝。code
你能夠利用 Buffer.BlockCopy()
方法 將源數組的字節 copy 到目標數組,以下代碼所示:htm
static void Main() { short [] arr1 = new short[] { 1, 2, 3, 4, 5}; short [] arr2 = new short[10]; int sourceOffset = 0; int destinationOffset = 0; int count = 2 * sizeof(short); Buffer.BlockCopy(arr1, sourceOffset, arr2, destinationOffset, count); for (int i = 0; i < arr2.Length; i++) { Console.WriteLine(arr2[i]); } Console.ReadKey(); }
若是沒看懂上面輸出,我稍微解釋下吧,請看這句: int count = 2 * sizeof(short)
表示從 arr1 中 copy 4個字節到 arr2 中,而 4 byte = 2 short
,也就是將 arr1 中的 {1,2}
copy 到 arr2 中,對吧。
要想獲取數組中的字節總長度,能夠利用 Buffer 中的 ByteLength 方法,以下代碼所示:
static void Main() { short [] arr1 = new short[] { 1, 2, 3, 4, 5}; short [] arr2 = new short[10]; Console.WriteLine("The length of the arr1 is: {0}", Buffer.ByteLength(arr1)); Console.WriteLine("The length of the arr2 is: {0}", Buffer.ByteLength(arr2)); Console.ReadKey(); }
從圖中能夠看出,一個 short 表示 2 個 byte, 5個 short 就是 10 個 byte,對吧,結果就是 short [].length * 2
,因此 Console 中的 10 和 20 就不難理解了,接下來看下 Buffer 的 SetByte 和 GetByte 方法,他們可用於單獨設置和提取數組中某一個位置的 byte,下面的代碼展現瞭如何使用 SetByte 和 GetByte。
static void Main() { short[] arr1 = { 5, 25 }; int length = Buffer.ByteLength(arr1); Console.WriteLine("\nThe original array is as follows:-"); for (int i = 0; i < length; i++) { byte b = Buffer.GetByte(arr1, i); Console.WriteLine(b); } Buffer.SetByte(arr1, 0, 100); Buffer.SetByte(arr1, 1, 100); Console.WriteLine("\nThe modified array is as follows:-"); for (int i = 0; i < Buffer.ByteLength(arr1); i++) { byte b = Buffer.GetByte(arr1, i); Console.WriteLine(b); } Console.ReadKey(); }
Buffer 在處理 含有基元類型的一個內存塊上 具備超高的處理性能,當你須要處理內存中的數據 或者 但願快速的訪問內存中的數據,這時候 Buffer 將是一個很是好的選擇。
譯文連接: https://www.infoworld.com/art...
更多高質量乾貨:參見個人 GitHub: csharptranslate