【问题标题】:C# Reference outer class from property listC# 从属性列表中引用外部类
【发布时间】:2017-02-25 03:09:48
【问题描述】:

给定以下类:

class OrderHeader
{
    public int orderNo;
    public List<OrderDetail> dtlRows = new List<OrderDetail>();
}

class OrderDetail
{
    public int rowNo;
    public string info;
}

是否可以在 dtlRows 列表中的每个 OrderDetail 对象中添加一个引用来引用父 OrderHeader 对象?就是这样,给定一个 OrderDetail 行,它可以知道来自父标题记录的数据。

所以类会变成:

class OrderDetail
{
    public int rowNo;
    public string info;
    public OrderHeader parentHdrRecord;
}

例子:

OrderHeader h = new OrderHeader();
h.orderNo = 12345;

OrderDetail d = new OrderDetail();
d.rowNo = 1;
d.info = "Test Row";
d.parentHdrRecord = h;

h.dtlRows.Add(d);

这是不好的形式/hacky吗?内存方面的成本高吗?

【问题讨论】:

  • 如果orderNo是唯一的,为什么不详细添加呢?
  • 对于这种情况,您可以考虑使用嵌套类,使用父级的 ctor 参数(存储引用),因为您可以轻松访问父级的私有成员,然后可以获取行索引,例如,在运行时通过方法调用到父级而不是将其存储为数据成员,如果项目被移动,则可能会不同步。

标签: c# class oop object


【解决方案1】:

让对象互相引用被认为是一种不好的做法,因为它被认为是循环依赖......但是;如果您使用的是 Entity Framework Code First,这几乎正是您在数据库中实现一对多关系的方式。

【讨论】:

  • 这就是我想到的地方。我已经看到它在实体框架中完成,并且想知道使用常规类来完成它是否是不好的做法。
【解决方案2】:

这是不好的形式/hacky吗?

只有当 OrderHeaderOrderDetail 类位于不同的项目中时,Visual Studio 中才会出现“循环依赖”错误。如果两者都在同一个项目中-那很好。

在内存方面做成本高吗?

没有。它只是一个参考 - 64 位(或 32 位,取决于目标平台)。与long number 一样的内存大小。

但是,这取决于您的应用程序逻辑: 如果OrderDetail 拥有自己的生命,则不再需要它的父级。但是您没有执行orderDetail.parentHdrRecord = null,那么垃圾收集器将不会删除父级以及所有未使用的百万级子级。

【讨论】:

  • "考虑循环依赖" ...在 C# 中,你显然可以弯曲/破坏规则,但在 F# 中试试这个。此外,诸如 NDepend 之类的工具将标记这些对象。我并不是说你不能这样做,因为显然你可以。他在问这是不是不好的形式/黑客,我只是建议遵循严格、统一的指导方针,是的。但是,正如我所提到的,即使是 EF 也违反了规则。
猜你喜欢
  • 1970-01-01
  • 2013-11-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-08-28
相关资源
最近更新 更多