正确地复制带有(字节)数组的C#结构?

前端之家收集整理的这篇文章主要介绍了正确地复制带有(字节)数组的C#结构?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
根据我的理解,在将结构变量分配给另一个变量时,通常会复制第一个变量而不是创建引用:
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()方法太多了.

建议更好的代码当然是非常受欢迎的.

解决方法

我找不到引用,但在第二种情况下,您只是复制数组的地址而不是整个数组.

您需要在复制数组内容的同时进行深层复制.

原文链接:https://www.f2er.com/csharp/91905.html

猜你在找的C#相关文章