结构中的 C# 数组

标签 c#

想要这样做: (编辑:错误的示例代码,忽略并跳过下面)

struct RECORD {
    char[] name = new char[16];
    int dt1;
}
struct BLOCK {
    char[] version = new char[4];
    int  field1;
    int  field2;
    RECORD[] records = new RECORD[15];
    char[] filler1 = new char[24];
}

但是无法在结构中声明数组大小,我该如何重新配置​​它?

编辑:布局的原因是我正在使用 BinaryReader 读取用 C 结构编写的文件。使用 BinaryReader 和 C# 结构联合 (FieldOffset(0)),我想将 header 作为字节数组加载,然后按照最初的意图读取它。

[StructLayout(LayoutKind.Sequential)]
unsafe struct headerLayout
{
    [FieldOffset(0)]
    char[] version = new char[4];
    int fileOsn;
    int fileDsn;
    // and other fields, some with arrays of simple types
}

[StructLayout(LayoutKind.Explicit)]
struct headerUnion                  // 2048 bytes in header
{
    [FieldOffset(0)]
    public byte[] headerBytes;      // for BinaryReader
    [FieldOffset(0)]
    public headerLayout header;     // for field recognition
}

最佳答案

使用fixed size buffers :

[StructLayout(LayoutKind.Explicit)]
unsafe struct headerUnion                  // 2048 bytes in header
{
    [FieldOffset(0)]
    public fixed byte headerBytes[2048];      
    [FieldOffset(0)]
    public headerLayout header; 
}

或者,您可以只使用该结构并使用以下扩展方法读取它:

private static T ReadStruct<T>(this BinaryReader reader)
        where T : struct
{
    Byte[] buffer = new Byte[Marshal.SizeOf(typeof(T))];
    reader.Read(buffer, 0, buffer.Length);
    GCHandle handle = default(GCHandle);
    try
    {
        handle = GCHandle.Alloc(buffer, GCHandleType.Pinned);
        return (T)Marshal.PtrToStructure(handle.AddrOfPinnedObject(), typeof(T));
    }
    finally
    {
        if (handle.IsAllocated) 
            handle.Free();
    }
}

关于结构中的 C# 数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8704161/

相关文章:

c# - 如何更改项目的 .NET Framework 版本?

c# - 显示项目集合时忽略 DebuggerDisplay

c# - 在 OpenRasta 处理程序中处理异常时,转换为响应的最佳方法是什么?

c# - 从数据库中删除记录时如何解决 Linq to SQL ChangeConflictException

C# Lambda 问题

c# - 使用 Lambda 表达式从集合中选择多个值

c# GDI 边缘空白检测算法

c# - DocumentDB transient 故障处理最佳实践

c# - 在 WCF 服务上运行 svcutil.exe 时,OperationBehaviorAttribute 错误

c# - 存储站点特定字符串值(标题、支持信息)等的最佳位置是什么