gpt4 book ai didi

C# 内存到 TextReader

转载 作者:行者123 更新时间:2023-12-04 15:20:41 29 4
gpt4 key购买 nike

什么是最佳获取方式 TextReader来自 Memory<byte> 的实例目的?
我可以这样写:

using (var stream = new MemoryStream(body.ToArray()))
using (var reader = new StreamReader(stream))
{
}
但也许有更好的方法?

最佳答案

StreamReader将处置底层证券Stream自动地。
#1 最简单的方法

Memory<byte> memory = GetSomeData();
using TextReader reader = new StreamReader(new MemoryStream(memory.ToArray()));
// some code
但是在这里您将整个内存内容复制到另一个数组中,这会消耗内存并为垃圾收集器提供更多工作。不推荐特别是如果数组包含大量数据。
还有另一种方法可以在不分配新数组的情况下进行。
#2 最优方式(推荐节省内存)
Memory<byte> memory = GetSomeData();
if (MemoryMarshal.TryGetArray(memory, out ArraySegment<byte> segment))
{
using TextReader reader = new StreamReader(new MemoryStream(segment.Array));
// some code
}
换句话说 ArraySegment将源内存区域作为数组返回。
测试
这是一个使用它的示例(基于 .NET Core 3.1 控制台应用程序)。
class Program
{
static void Main(string[] args)
{
string text = "Hello World!";
byte[] data = Encoding.UTF8.GetBytes(text);
Memory<byte> memory = data;

byte[] data1 = memory.ToArray();
Console.WriteLine("data == data1: {0}", data == data1);

if (MemoryMarshal.TryGetArray(memory, out ArraySegment<byte> segment))
{
byte[] data2 = segment.Array;
Console.WriteLine("data == data2: {0}", data == data2);
}

Console.WriteLine();

Console.WriteLine("Test 1");
Test1(text);

Console.WriteLine();

Console.WriteLine("Test 2");
Test2(text);

Console.ReadKey();
}

private static void Test1(string text)
{
Memory<byte> memory = Encoding.UTF8.GetBytes(text);
byte[] data = memory.ToArray();
ReadItTwice(memory, data);
}

private static void Test2(string text)
{
Memory<byte> memory = Encoding.UTF8.GetBytes(text);
if (MemoryMarshal.TryGetArray(memory, out ArraySegment<byte> segment))
{
byte[] data = segment.Array;
ReadItTwice(memory, data);
}
}

private static void ReadItTwice(Memory<byte> memory, byte[] data)
{
using MemoryStream ms = new MemoryStream(data);
using TextReader sr = new StreamReader(ms);
Console.WriteLine("Before change: {0}", sr.ReadToEnd());
if (MemoryMarshal.TryGetArray(memory, out ArraySegment<byte> segment))
segment.Array[0] = (byte)'_'; // change first symbol
ms.Position = 0;
Console.WriteLine("After change: {0}", sr.ReadToEnd());
}
}
输出
data == data1: False
data == data2: True

Test 1
Before change: Hello World!
After change: Hello World!

Test 2
Before change: Hello World!
After change: _ello World!

关于C# 内存到 TextReader,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63382206/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com