c# - 将 Delphi 变体记录转换为 C# 结构

标签 c# delphi

当我尝试从现有应用程序编写 C# 应用程序但在 Delphi 中开发时, 非常艰难,但设法解决了一些问题,但现在我遇到了一个问题......

Delphi 代码包含以下代码:

type  
  TFruit = record
    name : string[20];
    case isRound : Boolean of // Choose how to map the next section
      True  :
        (diameter : Single);  // Maps to same storage as length
      False :
        (length   : Single;   // Maps to same storage as diameter
         width    : Single);
  end;

即一个变体记录(里面有 case 语句),因此记录被构造,它的大小也是如此。 另一方面,我正在尝试在 C# struct 中做同样的事情,但还没有成功,我希望有人能在这里帮助我。 所以请告诉我是否有任何方法可以在 C# 中实现它。 提前致谢....

最佳答案

您可以使用显式结构布局来复制此 Delphi 变体记录。但是,我不会打扰,因为您似乎不太可能真的希望分配给 diameter 也分配给 length,反之亦然。 Delphi 记录声明看起来像是 1990 年代中期的 Delphi 编码风格。现代 Delphi 代码很少会以这种方式编写。

我会这样做:

struct Fruit
{
    string name;
    bool isRound;
    float diameter; // only valid when isRound is true
    float length;   // only valid when isRound is false
    float width;    // only valid when isRound is false
}

一个更优雅的选择是为每个结构字段创建一个具有属性的类。如果为 isRound 的无效值访问它们,您会安排 3 个 float 的属性 getter 和 setter 引发异常。

关于c# - 将 Delphi 变体记录转换为 C# 结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9331751/

相关文章:

c# - 更新 mdb 数据库表

c# - 如何访问对象的某些(私有(private))属性?

performance - 当屏幕上有很多控件时,会出现严重的 FireMonkey 性能问题

ios - 使用 Delphi XE5 在 UIView 类 [Swizzling] 中开始 Hook

delphi - SetRange 处于事件状态时如何获取 FireDAC 记录计数

c# - p/invoke C函数返回指向结构的指针

c# - 如何同时声明和填充集合?

c# - 使用 Ajax 以 guid 作为键的 .NET MVC 字典绑定(bind)问题

delphi - 如何在客户端仍处于连接状态时更新 DataSnap 服务器?

java - 当函数没有返回值时,Delphi XE2 是否正确从 Java/Axis2 导入 WSDL?