c# - 何时使用 ArraySegment<T> 而不是 Memory<T>?

标签 c#

我正在研究返回的最佳方式' views ' 放入一个非常大的数组中,发现 ArraySegment这完全符合我的需求。然而,我随后发现 Memory<T>这似乎表现得一样,除了需要一个跨度来查看内存。
对于创建 View 并将其写入大型 (2GB+) 数组的用例,使用哪个有关系吗?
大数组的原因是它们保存图像的字节。

最佳答案

内存有点像 Span 的包装器——一个不必在堆栈上的包装器。正如 CoolBots 提供的链接所指出的那样,它是对数组和数组段的补充,并不是真正的替代品。
您要考虑使用 Span/Memory 的主要原因是性能和灵活性。 Span 使您可以直接访问内存,而不是将其来回复制到数组,并且允许您以灵活的方式处理内存。下面我将从将数组用作字节到将其用作 uint 数组。
我将直接跳到 Span,但您可以改用 AsMemory,这样您就可以更轻松地传递它。但它仍然归结为从内存中获取跨度。
下面是一个例子:

        const int dataSize = 512;
        const int segSize = 256;

        byte[] rawdata = new byte[dataSize];

        var segment = new ArraySegment<byte>(rawdata, segSize, segSize);

        var seg1 = segment.AsSpan();

        var seg1Uint = MemoryMarshal.Cast<byte, uint>(seg1);

        for (int i = 0; i < segSize / sizeof(uint); ++i)
        {
            ref var data = ref seg1Uint[i];

            data = 0x000066;
        }

        foreach (var b in rawdata)
            Console.WriteLine(b);

关于c# - 何时使用 ArraySegment<T> 而不是 Memory<T>?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52224702/

相关文章:

c# - 自动开始 Storyboard (C#)

c# - 通过 TemplateSelector 在 DataTemplate 中进行双向数据绑定(bind)

c# - 如何将两个托管 x86/x64 dll 组合成一个托管 AnyCpu 库?

c# - 我的 Azure DocumentDB 文档类是否应该继承自 Microsoft.Azure.Documents.Document?

c# - 如何使用资源两次?

C# WPF MVVM 阻塞 UI 线程

c# - 如何在 C# 中生成可证明公平的掷骰子?

c# - 如何诊断 "The instruction at 0x......... referenced memory at 0x00000000"

C# Excel 互操作计数和替换

c# - "No supported translation to SQL"反序列化 IQueryable 表达式后