最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C#?MemoryStream中ToArray和GetBuffer的區(qū)別小小結(jié)

 更新時(shí)間:2025年07月31日 10:11:41   作者:鯉籽鯤  
MemoryStream?中的?GetBuffer()?和?ToArray()?是兩個(gè)用于獲取流數(shù)據(jù)的方法,核心區(qū)別在于數(shù)據(jù)范圍、內(nèi)存占用和安全性,本文就來介紹一下兩者的區(qū)別,感興趣的額可以了解一下

前言

MemoryStream 中的 GetBuffer()ToArray() 是兩個(gè)用于獲取流數(shù)據(jù)的方法,但它們的核心區(qū)別在于 數(shù)據(jù)范圍、內(nèi)存占用和安全性。

一、核心區(qū)別

特性GetBuffer()ToArray()
返回內(nèi)容返回 底層緩沖區(qū)的完整數(shù)組
(包含未使用的空間)。
返回 僅包含有效數(shù)據(jù)的數(shù)組
(排除未使用的空間)。
內(nèi)存占用可能包含大量未使用的空字節(jié)(0 填充),
占用更多內(nèi)存。
僅包含實(shí)際寫入的數(shù)據(jù),
內(nèi)存更高效。
性能速度快(直接返回引用,無需復(fù)制)。速度較慢(需復(fù)制數(shù)據(jù)到新數(shù)組)。
安全性可能暴露未初始化的字節(jié)(0 填充),
可能導(dǎo)致數(shù)據(jù)污染或解析錯(cuò)誤。
僅返回有效數(shù)據(jù),
避免未初始化字節(jié)的干擾。

二、具體示例

1.GetBuffer()的示例

public class Program
{
    public static void Main(string[] args)
    {
        using (MemoryStream ms = new MemoryStream())
        {
            byte[] data = Encoding.UTF8.GetBytes("test");
            ms.Write(data, 0, data.Length);

            byte[] buffer = ms.GetBuffer(); // 返回長度為 256 的數(shù)組(默認(rèn)初始容量為 256)
            Console.WriteLine(buffer.Length); // 輸出:256
            Console.WriteLine(ms.Length);     // 輸出:4(實(shí)際數(shù)據(jù)長度)
            Console.WriteLine(BitConverter.ToString(buffer));
            // 輸出:74-65-73-74-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00
        }
    }
}
  • 問題
    • 返回的數(shù)組包含大量未使用的 0 填充字節(jié)(如示例中的 256 - 4 = 252 個(gè) 0)。
    • 如果直接使用 buffer,可能導(dǎo)致數(shù)據(jù)解析錯(cuò)誤(例如,將 0 誤認(rèn)為有效數(shù)據(jù))。

2.ToArray()的示例

public class Program
{
    public static void Main(string[] args)
    {
        using (MemoryStream ms = new MemoryStream())
        {
            byte[] data = Encoding.UTF8.GetBytes("test");
            ms.Write(data, 0, data.Length);

            byte[] bytes = ms.ToArray(); // 返回長度為 4 的數(shù)組
            Console.WriteLine(bytes.Length); // 輸出:4
            Console.WriteLine(ms.Length);     // 輸出:4(實(shí)際數(shù)據(jù)長度)
            Console.WriteLine(BitConverter.ToString(bytes));//輸出:74-65-73-74
        }
    }
}
  • 優(yōu)勢(shì)
    • 僅返回實(shí)際寫入的數(shù)據(jù)(Length 指定的范圍),無多余 0 填充。
    • 更適合需要精確數(shù)據(jù)的場(chǎng)景(如序列化、加密、文件傳輸)。

三、關(guān)鍵場(chǎng)景對(duì)比

場(chǎng)景推薦方法原因
需要高效訪問底層緩沖區(qū)(如直接操作內(nèi)存)GetBuffer()避免復(fù)制開銷,但需確保僅使用有效數(shù)據(jù)范圍。
需要精確數(shù)據(jù)(如網(wǎng)絡(luò)傳輸、文件保存)ToArray()確保數(shù)據(jù)不含未使用的 0,避免解析錯(cuò)誤(如 Excel 文件損壞問題)。
流的容量遠(yuǎn)大于實(shí)際數(shù)據(jù)ToArray()避免浪費(fèi)內(nèi)存(如示例中 256 字節(jié) vs 4 字節(jié))。
需要避免未初始化字節(jié)的干擾ToArray()僅返回有效數(shù)據(jù),安全性更高。

四、注意事項(xiàng)

1. 異常情況

  • GetBuffer() 的限制:
    • 如果 MemoryStream 是通過 MemoryStream(byte[] buffer, bool writable) 構(gòu)造函數(shù)創(chuàng)建,并且 publiclyVisible 參數(shù)未設(shè)置為 true,則調(diào)用 GetBuffer() 會(huì)拋出 UnauthorizedAccessException
    • 解決方案:改用 ToArray() 或確保構(gòu)造時(shí)允許公開訪問緩沖區(qū)。

2. 容量與長度

  • Capacity vs Length
    • Capacity 是底層緩沖區(qū)的總大小(如默認(rèn) 256)。
    • Length 是實(shí)際寫入數(shù)據(jù)的大?。ㄈ?4)。
    • GetBuffer() 返回的數(shù)組長度等于 Capacity,而 ToArray() 返回的數(shù)組長度等于 Length。

3. 性能權(quán)衡

  • 大數(shù)據(jù)場(chǎng)景
    • 如果需要頻繁操作大容量數(shù)據(jù),可先通過 GetBuffer() 直接操作內(nèi)存,但需嚴(yán)格控制訪問范圍(如 Length 內(nèi))。
  • 小數(shù)據(jù)或精確性優(yōu)先
    • 直接使用 ToArray(),避免未初始化字節(jié)的干擾。

五、使用建議

  • 優(yōu)先使用 ToArray(),除非明確需要直接操作底層緩沖區(qū)且能確保安全。
  • 在涉及文件導(dǎo)出、網(wǎng)絡(luò)傳輸或第三方庫解析時(shí),ToArray() 更可靠(如解決 Excel 文件損壞問題)。
  • 通過 TryGetBuffer() 替代 GetBuffer(),避免異常風(fēng)險(xiǎn)。
    • .NET 4.5+ 引入了 TryGetBuffer() 方法,可安全檢查是否允許獲取緩沖區(qū):
    using (MemoryStream ms = new MemoryStream())
    {
        if (ms.TryGetBuffer(out var buffer))
        {
            // 安全獲取緩沖區(qū)
            byte[] data = new byte[ms.Length];
            Array.Copy(buffer.Array, buffer.Offset, data, 0, (int)ms.Length);
        }
        else
        {
            // 使用 ToArray()
            byte[] data = ms.ToArray();
        }
    }
    

到此這篇關(guān)于C# MemoryStream 中 ToArray 和 GetBuffer 的區(qū)別的文章就介紹到這了,更多相關(guān)C# ToArray GetBuffer內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • C#如何連接數(shù)據(jù)庫

    C#如何連接數(shù)據(jù)庫

    這篇文章主要介紹了C#如何連接數(shù)據(jù)庫問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-08-08
  • ScriptControl控件執(zhí)行自定義VBS腳本示例分析

    ScriptControl控件執(zhí)行自定義VBS腳本示例分析

    這篇文章主要介紹ScriptControl控件 msscript.ocx msscript.oca執(zhí)行自定義VBS腳本的示例代碼,需要的朋友可以參考下
    2013-04-04
  • DirectoryInfo引用一個(gè)相對(duì)目錄的實(shí)例

    DirectoryInfo引用一個(gè)相對(duì)目錄的實(shí)例

    這種特殊參數(shù)在Windows的命令提示符或者“運(yùn)行”對(duì)話框中都可以使用,等價(jià)于DOS中的cd命令參數(shù)。直接上代碼,一看你就懂了:
    2013-04-04
  • C#實(shí)現(xiàn)簡單的文件加密與解密方式

    C#實(shí)現(xiàn)簡單的文件加密與解密方式

    這篇文章主要介紹了C#實(shí)現(xiàn)簡單的文件加密與解密方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-01-01
  • C#/.Net開發(fā)chatGPT、openAI的簡單步驟

    C#/.Net開發(fā)chatGPT、openAI的簡單步驟

    OpenAI處于科技行業(yè)下一件大事件的最前沿,具有初創(chuàng)公司史詩般的標(biāo)志,下面這篇文章主要給大家介紹了關(guān)于C#/.Net開發(fā)chatGPT和openAI的相關(guān)資料,需要的朋友可以參考下
    2023-02-02
  • C#獲取某路徑文件夾中全部圖片或其它指定格式的文件名的實(shí)例方法

    C#獲取某路徑文件夾中全部圖片或其它指定格式的文件名的實(shí)例方法

    在本篇文章里小編給大家整理的是關(guān)于C#獲取某路徑文件夾中全部圖片或其它指定格式的文件名的實(shí)例方法,需要的朋友們參考下。
    2019-10-10
  • C#使用NPOI導(dǎo)出Excel類封裝

    C#使用NPOI導(dǎo)出Excel類封裝

    這篇文章主要為大家詳細(xì)介紹了C#使用NPOI導(dǎo)出Excel類封裝,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-02-02
  • c#操作Redis的5種基本類型匯總

    c#操作Redis的5種基本類型匯總

    這篇文章主要給大家介紹了關(guān)于c#操作Redis的5種基本類型,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者使用C#具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-07-07
  • C#正則表達(dá)式實(shí)用大全(建議收藏!)

    C#正則表達(dá)式實(shí)用大全(建議收藏!)

    正則表達(dá)式是處理字符串的強(qiáng)大工具,擁有獨(dú)特的語法和獨(dú)立的處理引擎,下面這篇文章主要給大家介紹了關(guān)于C#正則表達(dá)式實(shí)用大全的相關(guān)資料,文中通過實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2023-03-03
  • 十大C#中最具價(jià)值的語法糖分享

    十大C#中最具價(jià)值的語法糖分享

    C#語言是世界最優(yōu)雅的語言之一,深受廣大程序員的喜歡,尤其是其中的一些語法糖,下面就跟隨小編一起來了解一下其中10個(gè)比較實(shí)用的語法糖吧
    2024-11-11

最新評(píng)論

怀柔区| 临汾市| 东城区| 扶余县| 韩城市| 黎城县| 汽车| 赤水市| 赤城县| 永修县| 南乐县| 龙岩市| 博客| 长泰县| 年辖:市辖区| 吉木萨尔县| 虹口区| 株洲市| 长寿区| 通许县| 纳雍县| 康定县| 时尚| 呼图壁县| 桐柏县| 鄢陵县| 翼城县| 祥云县| 贵州省| 溧水县| 梓潼县| 江都市| 酉阳| 县级市| 商都县| 民丰县| 武威市| 南充市| 布尔津县| 高淳县| 榕江县|