Из того, что я понимаю, когда присваивается структурная переменная другой, первая обычно копируется вместо создания ссылки:
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 byte[]
, есть несколько других структур, поэтому слишком сложно написать Copy()
/ Clone()
методов для каждого из них.
Предложения по улучшению кода, конечно, очень приветствуются.