繁体   English   中英

在C#中初始化结构?

[英]Initialization of a struct in C#?

我正在修改的一些代码通过将结构加载到字节数组或从字节数组加载来广泛使用结构与某些工厂设备进行通信。

这是一个这种结构的简化示例。

[StructLayout(LayoutKind.Sequential, Pack = 1)]
public struct K_FOO
{
    public byte a_byte;    // 1 byte
    public BYTE3_TYPE b3;  // 3 bytes
    public int num;        // happens to be 4 bytes
}

BYTE3_TYPE看起来像这样......

[StructLayout(LayoutKind.Sequential, Pack = 1)]
public class BYTE3_TYPE
{
    [System.Runtime.InteropServices.MarshalAs(UnmanagedType.ByValArray, SizeConst = 3)]
    public byte[] L = new byte[3];
}

如果我只是做一个

    K_FOO origFoo = new K_FOO();

int和字节初始化为0,我假设因为它们是本机类型,但字节数组b3是* un *初始化 - 所有空值。 我必须明确加载它,例如,

    BYTE3_TYPE b3 = new BYTE3_TYPE();
    origFoo.b3 = b3;

......我想不出任何替代方案,因为结构不采用无参数构造函数,但真正的结构是巨大的。

但我发现了一些有趣的东西 我们有例程将这些结构复制到字节数组和从字节数组复制。 例如 。

   public static T ByteArrayToStructure<T>(byte[] buffer) where T : struct
    {
        int length = buffer.Length;
        IntPtr ptr = Marshal.AllocHGlobal(length);   // allocate (length) bytes
        Marshal.Copy(buffer, 0, ptr, length);  // copies into UNmanaged space
        T result = (T)Marshal.PtrToStructure(ptr, typeof(T));
        Marshal.FreeHGlobal(ptr);
        return result;
    }

......如果我称之为......

    K_FOO retFoo = ByteArrayToStructure<K_FOO>(buffer.bytes);

...生成的结构返回完全初始化,字节数组中的字节都已分配了空间,因此可以加载它们,显然是在PtrToStructure()调用中。 这意味着.Net“知道”如何初始化这样的结构。 那么有什么办法可以让.Net为我这样做,这样我就可以避免编写数百行显式初始化代码了吗? 提前致谢!

如果您将BYTE3_TYPE为结构而不是类,则默认构造函数(调用K_FOO origFoo = new K_FOO(); )会将整个事物初始化为零。

如果您尝试匹配现有规范并将其传递给自定义硬件,这也可能是正确的方法。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM