【问题标题】:Replacement of structs in C# [duplicate]在 C# 中替换结构 [重复]
【发布时间】:2019-08-26 09:40:35
【问题描述】:

我需要将我 10 年前编写的一些 C++ 代码移植到 C#。我不是 C# 专家,有人告诉我在 C# 中使用结构是不好的做法。

这是原始的 C++ 结构:

typedef struct TacticalLineStruct { 
   int NumGroups;                   // The number of groups in the struct
   int GroupID[MAX_UNITS];  // which Group the vertex belongs to
   int EdgeList[MAX_UNITS * MAX_UNITS][2];  // An array of edges
   float EdgeWeight[MAX_UNITS * MAX_UNITS]; // The weight for each edge
   int NumBelowThreshold;
   POINT GroupCenter[MAX_UNITS];    // The geographical center of each group
   int NumEdges;
} TacticalLineStruct;

在 C# 中执行此操作的正确方法是什么?

【问题讨论】:

  • 为什么结构不好开始?
  • VTC 太宽泛:这在很大程度上取决于使用情况。
  • 使用类编写它,结构通常是不好的做法,因为它们被复制为您作为参数传递的每种类型。
  • @Halhex 如果这是一个问题,很大程度上取决于它的使用。
  • @zetar 对于这个特殊的结构,请。原因见stackoverflow.com/q/3942721/11683

标签: c# c++ struct port


【解决方案1】:

我不得不说,看到你们中的大多数人都同意 struct 是一种不好的做法这一事实,我感到非常惊讶。我强烈反对:它只是一个不同的工具,它的优点和缺点与该语言提供的任何其他工具一样。 结构是值类型,它们像任何值一样工作(intfloatchar ...):它们通过复制而不是通过引用传递(在 C++ 中,它是等价的到一个不使用 & 符号的函数 &)。

基本上,您必须知道要使用该对象做什么。如果您要通过大部分代码库发送它,也许可以考虑使用一个类,因为跟随指针通常比复制整个结构更快。另一方面,如果这个对象应该存在于函数堆栈中以处理其他一些东西,那么也许你需要一个结构体。

无论如何,我们都无法告诉您如何完成您的工作 :p 但是,我们可以为您指出我们认为方便的方向;但我们肯定需要更多信息,而不仅仅是“我该怎么做?”。

最后,对于“结构是一种不好的做法吗?”这个问题,我会回答绝对不是。您只需要知道何时使用它们。对于隐含的问题“你应该如何实施你的解决方案,考虑到你没有提出一个明确的问题,我不能说太多(这可能是你的问题被否决的原因)

【讨论】:

  • 谢谢。我当然不是在问如何做到这一点。有人告诉我在 C# 中使用结构很糟糕。
  • 好像在 cpp 中使用 pass-by-value 很糟糕。是的,在大多数情况下,您希望避免复制所有内容。但在很多其他情况下,您确实想要复制!也许是为了线程安全,也许是为了数据对齐管理,也许是为了性能(例如在 ECS 内部)等等......
  • 在 C# 中,您应该从使用类开始,并且仅在特殊情况下将其更改为结构。假设你自己的类型会像 int/bool/etc 一样工作,这绝对是不正常的。
  • 我想这行得通,是的。但同样,由于我们不知道您想对该对象做什么,所以很难说。
  • @Naliwe ...或用于 FP 中的值语义;)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-09-28
  • 1970-01-01
  • 1970-01-01
  • 2019-03-10
  • 2014-02-10
  • 2013-11-29
相关资源
最近更新 更多