2011-09-23 75 views
1

现在我怎么做真的很奇怪。可悲的是我有很多结构并经常使用它们。有没有简单的方法来使用F#可变结构

这里是我如何行事了片刻:

[<type:StructLayout(LayoutKind.Sequential, Pack=1, CharSet=CharSet.Ansi)>] 
type OneDevice = { 
     mutable id    : UInt16 
     mutable typeDev   : byte 
     mutable portNum   : byte 
     mutable Parity   : byte 
     mutable StopBits  : byte 
     mutable BaudRate  : byte 
     mutable addr1   : byte 
     mutable addr2   : byte 
     mutable useCanal  : byte 
     mutable idGroup1  : byte 
     mutable idGroup2  : byte 
     mutable idGroup3  : byte 
     mutable idGroup4  : byte 
     mutable idGroupSos1  : byte 
     mutable idGroupSos2  : byte 
     mutable idGroupSos3  : byte 
     mutable idGroupSos4  : byte 
     mutable idSosReserv  : byte 
     mutable addrModbus  : byte 
     mutable offsetModbus : System.UInt16 
     [<field: MarshalAs(UnmanagedType.ByValArray, SizeConst = 17)>] 
     mutable pwd    : byte array 
     mutable offsetInModbus : UInt16 
     mutable reserv   : UInt16 } 

这是我如何定义结构。 “type str = struct ...”的作品真的不同!我需要我的结构变体。但写这只是我麻烦的一半,后半部分是我如何创建这种结构的新元素。让mutable dev = new OneDevice()不起作用!所以我需要做到这一点:

let mutable dev = { 
    id    = 0us 
    typeDev   = 0x00uy 
    portNum   = 0x00uy 
    Parity   = 0x00uy 
    StopBits  = 0x00uy 
    BaudRate  = 0x00uy 
    addr1   = 0x00uy 
    addr2   = 0x00uy 
    useCanal  = 0x00uy 
    idGroup1  = 0x00uy 
    idGroup2  = 0x00uy 
    idGroup3  = 0x00uy 
    idGroup4  = 0x00uy 
    idGroupSos1  = 0x00uy 
    idGroupSos2  = 0x00uy 
    idGroupSos3  = 0x00uy 
    idGroupSos4  = 0x00uy 
    idSosReserv  = 0x00uy 
    addrModbus  = 0x00uy 
    offsetModbus = 0us 
    pwd    = Array.zeroCreate 17 
    offsetInModbus = 0us 
    reserv   = 0us } 

这就是这里最古怪的部分。我可以让它变得更简单吗?

谢谢!

回答

5

问题是这些不是结构。他们是记录类型。使用type [<Struct>] MyStruct = ...

http://msdn.microsoft.com/en-us/library/dd233233.aspxhttp://msdn.microsoft.com/en-us/library/ee340416.aspx

记录类型:http://msdn.microsoft.com/en-us/library/dd233184.aspx

结构是值类型。记录是引用类型,如类。

+0

不应该是'[] type MyStruct'? – ildjarn

+0

可以工作。我有时使用这种方法与递归定义保持一致,递归定义需要'和'后面的属性。 – Daniel

相关问题