C#-内存拷贝功能
日常工作中需要将对象A的数据赋给对象B,常用做法就是字段/属性依次赋值,如果对象有很多个成员,依次写显然是个比较笨的方式。
下面使用内存拷贝功能来实现上述目的。引入命名空间:
using System.Runtime.InteropServices;
首先给出类Cup,内有四个变量:
[StructLayout(LayoutKind.Sequential)]
class Cup
{
public float volume;
public float height;
public float weight;
public float identifier;
}
创建对象C1和C2,此时C1有值,C2无值,需要把C1的值复制给C2:
byte[] raw = new byte[16];
Array.Copy(BitConverter.GetBytes(350f), 0, raw, 0, 4);
Array.Copy(BitConverter.GetBytes(15f), 0, raw, 4, 4);
Array.Copy(BitConverter.GetBytes(255f), 0, raw, 8, 4);
Array.Copy(BitConverter.GetBytes(1234f), 0, raw, 12, 4);
Cup c1 = new Cup()
{
volume = BitConverter.ToSingle(raw, 0),
height = BitConverter.ToSingle(raw, 4),
weight = BitConverter.ToSingle(raw, 8),
identifier = BitConverter.ToSingle(raw, 12),
};
Cup c2 = new Cup();
先将C1的值转换为字节数组Raw:
1 static byte[] StructToByte(object obj) 2 { 3 int size = Marshal.SizeOf(obj.GetType());//获取大小 4 byte[] buffer = new byte[size];//创建字节数组 5 IntPtr ip = Marshal.AllocHGlobal(size);//分配内存 6 Marshal.StructureToPtr(obj, ip, false);//将结构数据拷贝到内存 7 Marshal.Copy(ip, buffer, 0, size);//将内存数据拷贝到字节数组 8 Marshal.FreeHGlobal(ip);//释放内存 9 return buffer; 10 }
再将Raw的值赋给C2,则C2和C1相同。
1 static void ByteToStruct(object obj, byte[] bytes) 2 { 3 int size = Marshal.SizeOf(obj.GetType());//获取内存大小 4 IntPtr ip = Marshal.AllocHGlobal(size);//分配指定大小内存 5 Marshal.Copy(bytes, 0, ip, size);//将字节数据拷贝到内存 6 Marshal.PtrToStructure(ip, obj);//将内存数据拷贝到对象 7 Marshal.FreeHGlobal(ip);//释放内存 8 }
调用方法:
byte[] raw = StructToByte(c1); ByteToStruct(c2, raw);


浙公网安备 33010602011771号