cnd*_*cnd 5 f# constructor struct class
结构得到了默认的构造函数,就像我一样
type tagONEDEV_FlowRec =
struct
.......
end
Run Code Online (Sandbox Code Playgroud)
我可以这样做,new DeviceModel.tagONEDEV_FlowRec()但它无法解决这个问题:
let (<++|) device bytes size =
let unmanagedPtr = Marshal.AllocHGlobal(size : int)
Marshal.Copy( (bytes : byte array), 0, unmanagedPtr, size)
Marshal.PtrToStructure(unmanagedPtr, (device : obj)) // Here
Marshal.FreeHGlobal(unmanagedPtr)
Run Code Online (Sandbox Code Playgroud)
我需要一个类似的记录课
[<type:StructLayout(LayoutKind.Sequential, Pack=1, CharSet=CharSet.Ansi)>]
type tagONEDEV_FlowRec = {
mutable ....;}
Run Code Online (Sandbox Code Playgroud)
要么
type tagONEDEV_FlowRec =
class
.......
end
Run Code Online (Sandbox Code Playgroud)
但是这里没有默认的构造函数,并且结构非常大,无法手动初始化它们,所以如何将这些类与默认构造函数一起使用?
如果我找不到解决方案,我认为在C#或甚至VB.NET上重新编写这部分将会更快.听起来很像拐杖解决方案,但看起来我还不能用F#OOP部分拨号.
另外一个:我不想输入的东西是:
{TimeRec = 0;
Num = 0us;
FlagErr = 0us;
C6 = 0.0;
C2H6 = 0.0;
C3H8 = 0.0;
CH4 = 0.0;
CO2 = 0.0;
iC4H10 = 0.0;
iC5H12 = 0.0;
neoC5H12 = 0.0;
N2 = 0.0;
nC5H12 = 0.0;
O2 = 0.0;
nC4H10 = 0.0;
He = 0.0;
H2 = 0.0;
H2O = 0.0;
id = 0us; }
Run Code Online (Sandbox Code Playgroud)
< - 这就是我想要的默认设置,因为我有更多更大的结构然后编写这样的构造器是邪恶的.
正如 jpalmer 试图解释必须使用参数初始化记录一样。我认为你应该尝试使用
type MyStruct =
struct
val mutable myInt : int
val mutable myString : string
end
Run Code Online (Sandbox Code Playgroud)
请参阅此处:MSDN 文档显式字段
是的,我知道有更多的代码行和额外的“struct”、“end”和一些“val”,但这真的这么难吗?如果您的类型使用了 1000 个属性,无论如何您都应该重新考虑您的代码。