在c++中,经常类似这样定义结构体:
struct DEMO_STRUCT
{
int a;
int b;
char c[128];
};
定义这个结构体,占用了136个字节的内存空间,关键的是,它的内存块是连续的,其中c占用了128个字节
然后如果想在c#中定义这样的结构体,似乎很困难。经过一翻摸索,终于也算是找到方法了,但似乎是不推荐这样做。如下为对应c#的结构定义:
[StructLayout(LayoutKind.Sequential)]
public struct GOOD_STRUCT
{
public int a;
public int b;
unsafe public fixed byte c[128];
}
这个固定长度的占用,必需采用简单的数据类型:char、byte、int、short等。通过如下代码可以看到它的长度确实没错:
int sb = Marshal.Sizeof(typeof(GOOD_STRUCT)); // 可以看到,sb的值为136
这里sb的值为136,是想要的结果。注意,如果采用FixedBuffer,则会报编译错误cs1716:
[StructLayout(LayoutKind.Sequential)]
public struct GOOD_STRUCT
{
public int a;
public int b;
[FixedBuffer(typeof(byte),128)]
unsafe public byte c;
}
另外注意到,在字段的前面采用了 unsafe 关键字,如果去掉,会提示必需添加它,加上了它之后,又提示必需采用/unsafe的编译方式。如下为添加 /unsafe 编译选项的方法:
用记事本打开项目 .csproj 文件,在每个<PropertyGroup>组内添加子项:
<AllowUnsafeBlocks>true</AllowUnsafeBlocks>
然后重新加载工程,有关unsafe的提示就会消失,而且也可以正常编译和运行了。
本文简单介绍了关于c#中定义固定长度字段的方法,但它属于unsafe类型,所以并不推荐这样做。
参考网址:
Compiler Error CS1716 - C# reference | Microsoft Learn