最新国产好看的视频,伊人天堂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)存占用和安全性,本文就來(lá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)存更高效。
性能速度快(直接返回引用,無(wú)需復(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(); // 返回長(zhǎng)度為 256 的數(shù)組(默認(rèn)初始容量為 256)
            Console.WriteLine(buffer.Length); // 輸出:256
            Console.WriteLine(ms.Length);     // 輸出:4(實(shí)際數(shù)據(jù)長(zhǎng)度)
            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
        }
    }
}
  • 問(wèn)題
    • 返回的數(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(); // 返回長(zhǎng)度為 4 的數(shù)組
            Console.WriteLine(bytes.Length); // 輸出:4
            Console.WriteLine(ms.Length);     // 輸出:4(實(shí)際數(shù)據(jù)長(zhǎng)度)
            Console.WriteLine(BitConverter.ToString(bytes));//輸出:74-65-73-74
        }
    }
}
  • 優(yōu)勢(shì)
    • 僅返回實(shí)際寫入的數(shù)據(jù)(Length 指定的范圍),無(wú)多余 0 填充。
    • 更適合需要精確數(shù)據(jù)的場(chǎng)景(如序列化、加密、文件傳輸)。

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

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

四、注意事項(xiàng)

1. 異常情況

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

2. 容量與長(zhǎng)度

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

3. 性能權(quán)衡

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

五、使用建議

  • 優(yōu)先使用 ToArray(),除非明確需要直接操作底層緩沖區(qū)且能確保安全。
  • 在涉及文件導(dǎo)出、網(wǎng)絡(luò)傳輸或第三方庫(kù)解析時(shí),ToArray() 更可靠(如解決 Excel 文件損壞問(wèn)題)。
  • 通過(guò) 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ù)庫(kù)

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

    這篇文章主要介紹了C#如何連接數(shù)據(jù)庫(kù)問(wèn)題,具有很好的參考價(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)簡(jiǎn)單的文件加密與解密方式

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

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

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

    OpenAI處于科技行業(yè)下一件大事件的最前沿,具有初創(chuàng)公司史詩(shī)般的標(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種基本類型,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者使用C#具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-07-07
  • C#正則表達(dá)式實(shí)用大全(建議收藏!)

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

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

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

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

最新評(píng)論

绍兴县| 屯昌县| 定南县| 东城区| 阆中市| 广宗县| 五峰| 田东县| 湖州市| 呼图壁县| 讷河市| 闵行区| 拉萨市| 华阴市| 东明县| 宝鸡市| 莱州市| 洛川县| 娄烦县| 乾安县| 安陆市| 丹寨县| 略阳县| 龙川县| 叙永县| 色达县| 临城县| 喀喇沁旗| 高州市| 新源县| 门源| 大连市| 大城县| 应用必备| 革吉县| 宁乡县| 元朗区| 太原市| 讷河市| 洞口县| 许昌市|