struct结构体【C#】

结构体在内存中的排序:

结构体实例化后,会在内存中开辟空间。

内存是以字节为单位  byte【0】,byte【1】,byte【2】,byte【3】,byte【4】。。。

结构体先声明的值在byte[0]内。小端

struct  占内存
{
    byte  byte0;
    int   byte4_1;
    byte  byte5;     
    long  byte13_6;    //以此类推


}

结构体:

C#中的结构体很少用,一般用class,结构体做参数时用的多。

结构体是值类型传递。

public unsafe struct VCI_CAN_OBJ  //CAN每帧对象,
{          
 public uint ID;// 帧ID。        【u32】帧id,数据格式为靠右对齐。 详情请参照: 《8.附件1: ID对齐方式.pdf》说明文档。
 public uint TimeStamp;        //【u32】设备时间标识。 时间标示从CAN卡上电开始计时,计时单位为0.1ms。
 public byte TimeFlag;         //是否使用时间标识,=1时TimeStamp有效
 public byte SendType;         //发送类型。=0时为正常发送(发送失败会自动重发,重发超时时间为4秒, 4秒内没有发出则取消);=1时为单次发送
 public byte RemoteFlag;       //是否远程帧标志。 =0时为数据帧, =1时为远程帧(数据段空)。
 public byte ExternFlag;       //是否扩展帧标志。 =0时为标准帧(11位ID), =1时为扩展帧(29位ID)。
 public byte DataLen;          //有效字节 DLC (<=8),即CAN帧Data有几个字节。约束了后面Data[8]中有效字节数。
 public fixed byte Data[8];    //数据包,如DataLen定义为3,即Data[0]、 Data[1]、 Data[2]是有效的。
 public fixed byte Reserved[3];//系统保留。
}

fixed是固定的意思


//====================================

        public struct VCI_BOARD_INFO //主板信息
        { // VCI_ReadBoardInfo【要先运行VCI_OpenDevice(4,0,0);】   VCI_FindUsbDevice2
            public UInt16 hw_Version;//【0x0900】硬件版本,比如0x0100表示V1.00。
            public UInt16 fw_Version;//【0x0341】固件版本,v3.41
            public UInt16 dr_Version;//【0x0900】驱动版本,
            public UInt16 in_Version;//【0x0905】接口版本,
            public UInt16 irq_Num;//   【0x00】  保留参数。
            public byte can_Num;  //   【0x02】  表示有几路CAN通道。
            [MarshalAs(UnmanagedType.ByValArray, SizeConst = 20)]
            public char[] str_Serial_Num;// 板卡序列号。【31F01031C93】

            [MarshalAs(UnmanagedType.ByValArray, SizeConst = 40)]
            public char[] str_hw_Type;// 硬件类型【55 53 42 43 41 4e 2d 49 49】“USBCAN-II”

            [MarshalAs(UnmanagedType.ByValArray, SizeConst = 4)]
            public UInt16[] Reserved;// 系统保留。
        }

C语言的结构体:

typedef struct _VCI_CAN_OBJ 
{ 
 UINT ID; 
 UINT TimeStamp; 
 BYTE TimeFlag; 
 BYTE SendType; 
 BYTE RemoteFlag; 
 BYTE ExternFlag; 
 BYTE DataLen; 
 BYTE Data[8]; 
 BYTE Reserved[3]; 
}VCI_CAN_OBJ, *PVCI_CAN_OBJ; 

//定义了结构体,还定义了指针

// *是解指针,用于获取对象

// &是取指针,用于取对象地址,【注意,这个指针是有类型的】

结构体初始化:3种

C#结构体类型的初始化方式有三种:指定初始化、顺序初始化和构造函数初始化。

1. 指定初始化

指定初始化是指在定义结构体变量时,使用大括号{}来为结构体成员赋值。示例如下:

```csharp
struct A
{
    public int b;
    public int c;
}

A a = new A { b = 1, c = 2 };
```

2. 顺序初始化

顺序初始化是指在定义结构体变量时,按照结构体成员的顺序,依次为每个成员赋值。示例如下:

```csharp
struct A
{
    public int b;
    public int c;
}

A a = new A(1, 2);

// 定义结构体的构造函数
public A(int b, int c)
{
    this.b = b;
    this.c = c;
}
```

3. 构造函数初始化

如果结构体定义了构造函数,就不能再使用指定初始化和顺序初始化了。示例如下:

```csharp
struct A
{
    public int b;
    public int c;

    // 定义结构体的构造函数
    public A(int b, int c)
    {
        this.b = b;
        this.c = c;
    }
}

A a = new A(1, 2);
```

结构体布局:

   [StructLayout(LayoutKind.Explicit, Size = 16, CharSet = CharSet.Ansi)]
    public class MySystemTime
    {
        [FieldOffset(0)] public ushort wYear;
        [FieldOffset(2)] public ushort wMonth;
        [FieldOffset(4)] public ushort wDayOfWeek;
        [FieldOffset(6)] public ushort wDay;
        [FieldOffset(8)] public ushort wHour;
        [FieldOffset(10)] public ushort wMinute;
        [FieldOffset(12)] public ushort wSecond;
        [FieldOffset(14)] public ushort wMilliseconds;
    }
————————————————
版权声明:本文为CSDN博主「明如正午」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/sinat_40003796/article/details/127285446

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值