Правильно ли копировать структуры 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

Однако, если У меня есть байт [] внутри моей структуры, это поведение меняется:

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

Как я могу избежать этого? Мне действительно нужно работать с копией структуры complete , включая любые байтовые массивы.

Спасибо! ♪


Редактировать: Спасибо за вашу помощь! Чтобы глубоко копировать мою структуру, я теперь использую этот код:

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;
}

Он должен быть вызван так:

MYSTRUCT1 test2 = (MYSTRUCT1)deepCopyStruct(test1, typeof(MYSTRUCT1));

Кажется, это работает нормально, хотя я знаю, что это грязный код.

Однако так как структуры, с которыми я работаю, имеют более 50 байт [] нескольких других структур, в них слишком много работы, чтобы написать Copy () / Clone () методы для каждого из них.

Предложения по улучшению кода, конечно, очень приветствуются.

6
задан Buoysel 21 August 2010 в 13:33
поделиться