gpt4 book ai didi

c# - 与 C++ 结构等效(或更好)的 C# 结构

转载 作者:行者123 更新时间:2023-11-30 05:22:04 32 4
gpt4 key购买 nike

我是一名正在转向 C# 的 C++ 程序员(真的是新手)。到目前为止,这是一个非常简单的过渡:)

我正在将一些代码从 C++ 移植(嗯,重写)到 C#。关于如何移植以下 C++ STL 结构,我遇到了很多可能性。这是我的 C++ 结构布局的 C++ 代码片段(为了避免困惑,我没有费心显示枚举,但如果需要我可以添加):

struct DeviceConnection_t
{
DeviceType_e device;
DeviceState_e state;
bool isPass;

DeviceConnection_t() :
device(DEV_TYPE_UNKNOWN),
state(DEV_STATE_DISCONNECTED),
isPass(false)
{}
};

struct Given_t
{
std::string text;
std::vector<DeviceConnection_t> deviceConnections;
};

struct Action_t
{
ActionEventType_e type;
uint32_t repeat_interval;
uint32_t repeat_duration;
DeviceType_e device;
bool isDone;

Action_t() :
type(AE_TYPE_UNKNOWN),
repeat_interval(0),
repeat_duration(0),
device(DEV_TYPE_UNKNOWN),
isDone(false)
{}
};

struct When_t
{
std::string text;
std::multimap<uint32_t, Action_t> actions; // time, action
};

所以这里我有一个 DeviceConnection_t vector ,我在这里阅读过它:c-sharp-equivalent-of-c-vector-with-contiguous-memory可以做成 C# List<DeviceConnection_t> .这似乎有效,到目前为止一切顺利。

接下来是我的multimap<int, Action_t>其中 int 是预期/允许重复条目的时间值。我在这里阅读:multimap-in-net C# 中没有等效项,但有各种实现。

所以我可以使用其中之一,但我读到的其他问题如下:order-list-by-date-and-time-in-string-format让我想到可能有更好的方法来实现我想要的。

我真正想要的是:1. list Action_t按时间顺序 - 其中 time可能是 Action_t 的一个元素(我将它作为我的 c++ 中的一个元素删除,因为它成为了我的多映射键)。我还需要能够搜索集合以查找时间值。2. 某种默认构造函数来填充新实例化结构的默认值,但我也看不出这是如何完成的。

我真的很喜欢 Dictionary 的外观C# 类,但我认为目前不符合我的任何要求(这里可能有误)。

所以我的两个问题是:

  1. 创建按时间排序的对象集合的最佳方法是什么?
  2. 如何为结构的新实例分配默认值? (与默认构造函数在 C++ 中的作用相同)?

最佳答案

通过使用 struct ,不可能强制执行初始值。不能提供显式的默认构造函数,在默认构造的情况下,所有值都将使用它们的默认值进行初始化。只能提供额外的构造函数,其中可以初始化字段。在示例中,如果 AE_TYPE_UNKNOWNDEV_TYPE_UNKNOWN将是 0 ,那么默认初始化实际上等同于您的值。

struct Action_t
{
// example constructor, but there will always be a default constructor
public Action_t(ActionEventType_e type, DeviceType_e device)
{
this.type = type;
this.device = device;
this.isDone = false;
this.repeat_interval = 0;
this.repeat_duration = 0;
}

public ActionEventType_e type;
public UInt32 repeat_interval;
public UInt32 repeat_duration;
public DeviceType_e device;
public bool isDone;
}

如果您需要使用不同于默认值的值强制初始化,那么您需要创建一个 class ,其中可以进行显式初始化。

class Action_t
{
public ActionEventType_e type = ActionEventType_e.AE_TYPE_UNKNOWN;
public UInt32 repeat_interval = 0;
public UInt32 repeat_duration = 0;
public DeviceType_e device = DeviceType_e.DEV_TYPE_UNKNOWN;
public bool isDone = false;
}

但是,为了获得更大的灵 active ,我建议使用公共(public)属性,作为自动属性或作为具有私有(private)支持字段的公共(public)属性。根据您的选择和使用的语言标准版本,您有不同的选项来编写属性和初始化:

class Action_t
{
public Action_t()
{
repeat_interval = 0;
}
public UInt32 repeat_interval { get; set; }


private UInt32 _repeat_duration = 0;
public UInt32 repeat_duration
{
get { return _repeat_duration; }
set { _repeat_duration = value; }
}

public bool isDone { get; set; } = false; // valid for C# 6
}

您应该了解 struct 之间的区别和 class在 C# 中,由于存在一些作为 C++ 程序员可能意想不到的主要差异,其中 struct基本上是一个 public -默认class .然后决定,如果 struct适合您的情况。


排序 multimap 的最佳等价物可能是 SortedDictionary<key, ICollection<values>>使用处理新键/添加到现有键的添加方法。

IDictionary<DateTime, ICollection<Action_t>> actions = new SortedDictionary<DateTime, ICollection<Action_t>>();
void AddAction(DateTime key, Action_t action)
{
ICollection<Action_t> values;
if (!actions.TryGetValue(key, out values))
{
values = new List<Action_t>();
actions[key] = values;
}
values.Add(action);
}

关于c# - 与 C++ 结构等效(或更好)的 C# 结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39845396/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com