根据我的理解,在将结构变量分配给另一个变量时,通常会复制第一个变量而不是创建引用:
public struct MYSTRUCT1 { public byte val1; } // (...) public DoSomething() { MYSTRUCT1 test1; test1.val1 = 1; MYSTRUCT1 test2 = test1; test2.val1 = 2; Console.WriteLine(test1.val1); Console.WriteLine(test2.val1); }
这很好用,输出是:
1 2
但是,如果我的struct中有一个byte [],则此行为会更改:
public struct MYSTRUCT1 { public byte[] val1; } // (...) public DoSomething() { MYSTRUCT1 test1; test1.val1 = new byte[0x100]; test1.val1[0] = 1; MYSTRUCT1 test2 = test1; test2.val1[0] = 2; Console.WriteLine(test1.val1[0]); Console.WriteLine(test2.val1[0]); }
这是输出:
2 2
我怎么能避免这个?我真的需要使用完整结构的副本,包括任何字节数组.
谢谢! ♪
编辑:感谢您的帮助!
为了深层复制我的结构,我现在使用这个代码:
public static object deepCopyStruct(object anything,Type anyType) { return RawDeserialize(RawSerialize(anything),anyType); } /* Source: http://bytes.com/topic/c-sharp/answers/249770-byte-structure */ public static object RawDeserialize(byte[] rawData,int position,Type anyType) { int rawsize = Marshal.SizeOf(anyType); if (rawsize > rawData.Length) return null; IntPtr buffer = Marshal.AllocHGlobal(rawsize); Marshal.Copy(rawData,position,buffer,rawsize); object retobj = Marshal.PtrToStructure(buffer,anyType); Marshal.FreeHGlobal(buffer); return retobj; } /* Source: http://bytes.com/topic/c-sharp/answers/249770-byte-structure */ public static byte[] RawSerialize(object anything) { int rawSize = Marshal.SizeOf(anything); IntPtr buffer = Marshal.AllocHGlobal(rawSize); Marshal.StructureToPtr(anything,false); byte[] rawDatas = new byte[rawSize]; Marshal.Copy(buffer,rawDatas,rawSize); Marshal.FreeHGlobal(buffer); return rawDatas; }
它必须像这样调用:
MYSTRUCT1 test2 = (MYSTRUCT1)deepCopyStruct(test1,typeof(MYSTRUCT1));
这似乎工作正常,但我知道这是脏代码.
但是,由于我正在使用的结构有超过50个字节[]的几个其他结构,所以为每个结构编写Copy()/ Clone()方法太多了.
建议更好的代码当然是非常受欢迎的.
解决方法
我找不到引用,但在第二种情况下,您只是复制数组的地址而不是整个数组.
您需要在复制数组内容的同时进行深层复制.