【问题标题】:C# - Picking a data structure for storage of memory from a periphieral deviceC# - 从外围设备中选择用于存储内存的数据结构
【发布时间】:2016-10-10 20:12:04
【问题描述】:

我想从外围设备中保留大约 50 字节的内存。我有 10 个这样的外围设备,每个都有 5 个“通道”。 (每个通道都有自己的 50 字节内存)。

我的第一个想法是创建一个二维结构数组,每个结构都有一个用于有效性的布尔值(最后设置)和一个 50 字节的数组。我可以按如下方式访问此数组: myStruct[DEVICE][CHANNEL].arrayOfBytes[i];

但是,我是 C# 的新手(以及一般的编程)。从一些快速阅读看来,在 C# 中使用结构似乎是不受欢迎的。用像 C# 这样的语言做这样的事情的理想方法是什么?

【问题讨论】:

  • 如果你是 C# 新手,我建议一个好的经验法则是坚持使用一个类,如果它可以满足你的目的(并且对于绝大多数事情,它会)。如果你发现使用一个类会给你一个特定的问题,你需要使用一个结构来解决,然后才考虑使用一个。在您的示例中使用结构并没有错,但是您必须质疑它们是否提供了真正的好处来证明它们附带的陷阱是正确的。 This question 是一本好书。

标签: c# memory data-structures struct


【解决方案1】:

这里结构的替代方案是类,对这个问题很重要的主要区别是您的数据更有可能最终出现在堆上而不是带有类的堆栈上。

不过,在我看来,结构体的使用是可以的。一般来说,我听说您希望将结构保持在 20 字节左右,而且由于数组是引用类型,因此您完全可以做到这一点。

【讨论】:

  • 但是结构体只有 4 或 8 个字节长(引用大小),因为数组是一个引用对象。除非他使用固定大小的数组……不,我们不要走那条路。
  • 非常好。我不知道为什么我认为数组大小将成为结构的一部分。我知道得更好:/
【解决方案2】:

除非您确定您的设备将始终按顺序编号,否则我不建议使用二维数组。如果您可以拥有设备 1、8 和 12,那么您将浪费大量空间。与频道相同。即使现在按顺序编号,将来也可能会发生变化。

根据需要的访问速度,您可以考虑创建多个类来保存这些信息。比如:

public class Channel
{
    public int ChannelNumber {get; private set;}
    public byte[] ChannelData {get; set; }
    // constructor, etc.
}

public class Device
{
    public int DeviceNumber {get; private set; }
    public Dictionary<int, Channel> Channels {get; private set; }
    // constructor, etc.
}

您的主程序包含一个设备字典:

public Dictionary<int, Device> Devices;

所以Devices 由设备号索引,在Device 内,Channels 由通道号访问。这样可以灵活地布局设备和通道。

要获取特定设备/通道的信息,您可以调用如下函数:

public byte[] GetChannelInfo(int deviceId, int channelId)
{
    Device device;
    if (!Devices.TryGetValue(deviceId, out device))
    {
        // error, device doesn't exist.
    }
    Channel channel;
    if (!device.Channels.TryGetValue(channelId, out channel))
    {
        // error, channel does not exist on that device
    }
    return channel.ChannelData;
}

现在,这看起来可能很混乱,但实际上并非如此。而不是:

var data = MyArrayOfStructs[0,0].Data;

你有:

var data = GetChannelInfo(0, 0);

这以相对较小的性能成本为您提供了更大的灵活性。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-05
    • 1970-01-01
    • 1970-01-01
    • 2023-03-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多