Buo*_*sel 6 c# arrays struct copy reference
根据我的理解,在将结构变量分配给另一个变量时,通常会复制第一个变量而不是创建引用:
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);
}
Run Code Online (Sandbox Code Playgroud)
这很好用,输出是:
1
2
Run Code Online (Sandbox Code Playgroud)
但是,如果我的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]);
}
Run Code Online (Sandbox Code Playgroud)
这是输出:
2
2
Run Code Online (Sandbox Code Playgroud)
我怎么能避免这个?我真的需要使用完整结构的副本,包括任何字节数组.
谢谢!♪
编辑:感谢您的帮助!为了深层复制我的结构,我现在使用这个代码:
public static object deepCopyStruct(object anything, Type anyType)
{
return RawDeserialize(RawSerialize(anything), 0, 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, buffer, false);
byte[] rawDatas = new byte[rawSize];
Marshal.Copy(buffer, rawDatas, 0, rawSize);
Marshal.FreeHGlobal(buffer);
return rawDatas;
}
Run Code Online (Sandbox Code Playgroud)
它必须像这样调用:
MYSTRUCT1 test2 = (MYSTRUCT1)deepCopyStruct(test1, typeof(MYSTRUCT1));
Run Code Online (Sandbox Code Playgroud)
这似乎工作正常,但我知道这是脏代码.
但是,由于我正在使用的结构中有超过50个byte[]其他结构,因此为每个结构编写Copy()/ Clone()方法的工作量太大了.
建议更好的代码当然是非常受欢迎的.