你可以使用
新的 Span<T>
和 MemoryMarshal
类型 来实现此操作。
请注意,这仅适用于最近版本的 C#,目前您必须使用 NuGet 包来提供库,但这将会改变。
例如,要将 char 数组“转换”为 short 数组,您可以编写以下代码:
var charArray = new char[100];
Span<short> shortArray = MemoryMarshal.Cast<char, short>(charArray);
charArray[0] = 'X';
Console.WriteLine(charArray[0]);
++shortArray[0];
Console.WriteLine(charArray[0]);
这种方法已有记录,并且不会复制任何数据 - 由于设计的缘故,它也非常高效。
请注意,这也适用于结构体:
struct Test
{
public int X;
public int Y;
public override string ToString()
{
return $"X={X}, Y={Y}";
}
}
...
var testArray = new Test[100];
Span<long> longArray = MemoryMarshal.Cast<Test, long>(testArray);
testArray[0].X = 1;
testArray[0].Y = 2;
Console.WriteLine(testArray[0]);
longArray[0] = 0x0000000300000004;
Console.WriteLine(testArray[0]);
同时请注意,这也允许您做一些可疑的事情,比如:
struct Test1
{
public int X;
public int Y;
public override string ToString()
{
return $"X={X}, Y={Y}";
}
}
struct Test2
{
public int X;
public int Y;
public int Z;
public override string ToString()
{
return $"X={X}, Y={Y}, Z={Z}";
}
}
...
var test1 = new Test1[100];
Span<Test2> test2 = MemoryMarshal.Cast<Test1, Test2>(test1);
test1[1].X = 1;
test1[1].Y = 2;
Console.WriteLine(test1[1]);
test2[0].Z = 10;
Console.WriteLine(test1[1]);
Convert.ToBoolean(byte)
。 - Rahul