C#Struct No无参数构造函数? 看看我需要完成什么

我使用结构传递给非托管DLL,因为 –

[StructLayout(LayoutKind.Sequential)] public struct valTable { public byte type; public byte map; public byte spare1; public byte spare2; public int par; public int min; public byte[] name; public valTable() { name = new byte[24]; } } 

上面的代码将无法编译,因为VS 2005会抱怨“Structs不能包含显式无参数构造函数”。 为了将这个结构传递给我的DLL,我必须传递一个struct的数组,如valTable[] val = new valTable[281];

我想要做的是当我说new ,构造函数被调用并且它创建了一个像我试图演示的字节数组,因为DLL正在寻找每个维度中大小为24的字节数组。

我怎么能做到这一点?

你可以使用一个固定大小的缓冲区 – 我怀疑你真的想要它,以便在结构中获取数据“内联”(而不是在其他地方引用数组)。

 public fixed byte name[24]; 

您需要将结构声明为不安全的。

请注意,任何需要调用静态方法或提供任何类型的自定义构造函数的“解决方案”都将失败,您的明确目标是能够创建这些结构的数组。

我建议写这段代码。

 [StructLayout(LayoutKind.Sequential)] public struct valTable { public byte type; public byte map; public byte spare1; public byte spare2; public int par; public int min; public byte[] name; static public valTable Create() { valTable vT = new valTable(); vT.name = new byte[24]; return vT; } } 

结构构造函数类似于类构造函数,但以下差异除外:

  • 结构不能包含显式无参数构造函数。 Struct成员会自动初始化为其默认值。
  • 结构不能具有以下forms的初始化程序:base(argument-list)。

这意味着

 A default(parameterless) constructor for a struct could set different values than the all-zeroed state which would be unexpected behavior. The .Net Runtime therefore prohabits default constructors for struct. 

解决此问题的典型方法是创建一个静态方法,该方法将创建新实例,以您希望的方式初始化它并返回它。 这是在.NET中完成使用特定值初始化结构的方式。


REF; 结构不能包含显式无参数构造函数。 为什么?

在Asad Butt的回答的基础上 ,您可以创建一个静态方法来执行构造函数的工作,如下所示:

 [StructLayout(LayoutKind.Sequential)] public struct valTable { public byte type; public byte map; public byte spare1; public byte spare2; public int par; public int min; public byte[] name; public valTable() public static valTable NewTable() { valTable tbl = new valTable(); tbl.name = new byte[24]; return tbl; } } 

您将在此框架中看到.NET Framework中的类。 Guid.NewGuid()立即Guid.NewGuid()在脑海中。 可能还有其他人。

不是最干净的修复,但你可以添加一个参数,永远不会使用它?

 [StructLayout(LayoutKind.Sequential)] public struct valTable { public byte type; public byte map; public byte spare1; public byte spare2; public int par; public int min; public byte[] name; public valTable(int x) { name = new byte[24]; } } 

对于你需要做的事,你真的需要一个我认为的课程。 结构体默认情况下已经实现了无参数构造函数,这就是为什么你不能定义另一个。