Span 是 C# 中引入的一个结构类型,用于提供对连续内存区域的类型安全访问。这个特性最初在 .NET Core 2.1 中引入,旨在优化性能,尤其是在处理数组、字符串和其他类型的缓冲区时。Span 可以看作是一个窗口,它允许开发者在不复制数据的情况下操作内存。
C#static void Main(string[] args)
{
ProcessBytes(System.Text.Encoding.UTF8.GetBytes("0123456789"));
}
static void ProcessBytes(byte[] data)
{
// 假设我们只想处理前10个字节
Span<byte> dataSpan = new Span<byte>(data, 0, 10);
for (int i = 0; i < dataSpan.Length; i++)
{
// 对每个字节执行操作
dataSpan[i] = (byte)(dataSpan[i] + 1);
}
Console.WriteLine(System.Text.Encoding.UTF8.GetString(dataSpan));
}
C#static void Main(string[] args)
{
SliceString("0123456789abcdefg");
}
static void SliceString(string str)
{
ReadOnlySpan<char> span = str.AsSpan();
ReadOnlySpan<char> slice = span.Slice(start: 5, length: 10);
Console.WriteLine(slice.ToString());
}
C#static void Main(string[] args)
{
byte[] data = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
byte[] data1 = new byte[10];
CopyMemory(data, data1);
}
static void CopyMemory(byte[] source, byte[] destination)
{
Span<byte> sourceSpan = source.AsSpan();
Span<byte> destinationSpan = destination.AsSpan();
// 假设 destination 数组足够大
sourceSpan.CopyTo(destinationSpan);
}
C#static void Main(string[] args)
{
byte[] data = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
ProcessLargeData(data);
foreach (var item in data)
{
Console.WriteLine(item.ToString());
}
}
static void ProcessLargeData(Memory<byte> memory)
{
// 使用 Memory<T> 的 .Span 属性来获取 Span<T>
Span<byte> span = memory.Span;
// 现在可以安全地在同步方法中操作内存
for (int i = 0; i < span.Length; i++)
{
// 对内存执行操作
span[i] = (byte)(span[i] + 1);
}
}
Span 的引入显著提高了 C# 程序处理内存数据的能力,尤其对于需要高性能且内存敏感的应用程序而言,它提供了前所未有的控制和优化能力。通过上述示例,我们可以看到 Span 在实际编程中是如何为我们提供更优雅和高效的数据操作方式。
本文作者:技术老小子
本文链接:
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!