C#如何使用Memory和ReadOnlyMemory实现内存安全操作

来源:建站教程作者:弥生美月头衔:网络博主
导读:本期聚焦于小伙伴创作的《C#如何使用Memory和ReadOnlyMemory实现内存安全操作》,敬请观看详情,探索知识的价值。以下视频、文章将为您系统阐述其核心内容与价值。如果您觉得《C#如何使用Memory和ReadOnlyMemory实现内存安全操作》有用,将其分享出去将是对创作者最好的鼓励。

在C#里,Memory<T>和ReadOnlyMemory<T>是System命名空间下表示连续内存区域的轻量结构。它们不直接持有数据,而是对数组、字符串或自定义内存池的视图包装,能在栈和堆之间安全传递,避免拷贝与指针风险。

C#如何使用Memory和ReadOnlyMemory实现内存安全操作

Memory与ReadOnlyMemory基础

Memory<T>允许读写底层内存,ReadOnlyMemory<T>则限制为只读,适合传递不应被修改的数据。二者都可从数组、字符串轻松创建。

using System;

class Demo
{
    static void Main()
    {
        int[] arr = { 1, 2, 3, 4, 5 };
        // 从数组创建可读写内存视图
        Memory<int> mem = arr;
        // 从字符串创建只读内存
        ReadOnlyMemory<char> rom = "hello".AsMemory();

        Console.WriteLine(mem.Length);
        Console.WriteLine(rom.Span[0]);
    }
}

切分内存视图

使用Slice方法可得到子区域视图,不产生新数组,仅偏移指针与长度,是内存安全操作的核心手段。

using System;

class SliceDemo
{
    static void Main()
    {
        int[] data = { 10, 20, 30, 40, 50 };
        Memory<int> mem = data;
        // 取索引1开始长度为3的视图
        Memory<int> slice = mem.Slice(1, 3);
        foreach (var i in slice.Span)
        {
            Console.WriteLine(i);
        }
    }
}

只读场景的保护

当方法只读取内容时,参数声明为ReadOnlyMemory<T>可阻止调用方意外修改,也明确表达设计意图。

using System;

class ReadOnlyDemo
{
    static void Print(ReadOnlyMemory<char> text)
    {
        foreach (var c in text.Span)
        {
            Console.Write(c);
        }
    }

    static void Main()
    {
        ReadOnlyMemory<char> name = "safe".AsMemory();
        Print(name);
    }
}

异步方法中的使用

Memory<T>可跨越await边界,而Span<T>不能。因此在异步读写流时,用Memory作为参数类型最安全。

using System;
using System.IO;
using System.Threading.Tasks;

class AsyncDemo
{
    static async Task WriteAsync(Stream stream, Memory<byte> buffer)
    {
        await stream.WriteAsync(buffer);
    }

    static async Task Main()
    {
        byte[] bytes = { 1, 2, 3 };
        Memory<byte> mem = bytes;
        using var ms = new MemoryStream();
        await WriteAsync(ms, mem);
    }
}

对比与选择

类型可读写可跨异步典型用途
Span<T>同步局部内存处理
Memory<T>异步或传递读写视图
ReadOnlyMemory<T>传递只读数据片段

合理选用上述类型,可显著降低内存错误概率,同时维持高性能。优先用ReadOnlyMemory表达不变性,用Memory替代byte数组拷贝,是C#内存安全操作的通行做法。

C#MemoryReadOnlyMemory内存安全Span修改时间:2026-07-25 09:12:20

免责声明:​ 已尽一切努力确保本网站所含信息的准确性。网站内容多为原创整理与精心编撰,观点力求客观中立。本站旨在免费分享,内容仅供个人学习、研究或参考使用。若引用了第三方作品,版权归原作者所有。如内容涉及您的权益,请联系我们处理。
内容垂直聚焦
专注技术核心技术栏目,确保每篇文章深度聚焦于实用技能。从代码技巧到架构设计,为用户提供无干扰的纯技术知识沉淀,精准满足专业提升需求。
知识结构清晰
覆盖从开发到部署的全链路。AI、前端、编程、数据库、服务器、建站、系统层层递进,构建清晰学习路径,帮助用户系统化掌握开发与运维所需的核心技术。
深度技术解析
拒绝泛泛而谈,深入技术细节与实践难点。无论是数据库优化还是服务器配置,均结合真实场景与代码示例进行剖析,致力于提供可直接应用于工作的解决方案。
专业领域覆盖
精准对应开发生命周期。从前端界面到后端编程,从数据库操作到服务器运维,形成完整闭环,一站式满足全栈工程师和运维人员的技术需求。
即学即用高效
内容强调实操性,步骤清晰、代码完整。用户可根据教程直接复现和应用于自身项目,显著缩短从学习到实践的距离,快速解决开发中的具体问题。
持续更新保障
专注既定技术方向进行长期、稳定的内容输出。确保各栏目技术文章持续更新迭代,紧跟主流技术发展趋势,为用户提供经久不衰的学习价值。