c#定义占用固定字节长度的结构体字段

在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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值