【问题标题】:Virtual ICollection虚拟 ICollection
【发布时间】:2017-01-05 09:40:26
【问题描述】:

在 C# 中 这是高效的编程吗?

我想知道,因为 t1 链接到 t2,而 t2 链接到 t1,因此它也链接回自身,这是否会占用更多空间,或者它是否是危险的算法/代码?

static void Main(string[] args)
{
    Test t1 = new Test(1);
    Test t2 = new Test(2);
    Test t3 = new Test(3);
    Test t4 = new Test(4);
    t1.Links = new List<Test>();
    t1.Links.Add(t2);
    t2.Links = new List<Test>();
    t2.Links.Add(t1);

    Console.WriteLine(t1.Links.First().Links.First().id);
    Console.Read();
    return;
}

public class Test
{
    public int id { get; set; }

    public virtual ICollection<Test> Links { get; set; }

    public Test(int Id)
    {
        id = Id;
    }
}

我在 MVC 中使用这种类型的结构。我注意到 MVC 还会从数据库中加载这些虚拟对象以及主对象,所以我想知道这是否会是一个问题

【问题讨论】:

  • 你想用那个对象树归档什么?如果您的问题需要具有循环引用的数据结构,则可以创建这样的数据结构......其中没有任何危险;)
  • 就像@JanDotNet 刚才所说的那样,没有什么不好的。您可以通过创建更好的结构来保护时间/空间。您可以在这里绝对安全地列出一个列表……但这实际上取决于您要存档的内容。

标签: c# virtual icollection


【解决方案1】:

实例之间循环引用的主要问题是在程序运行时更难推理数据结构。这会导致大量代码变得更加复杂,因为它需要预测和检测可能的循环引用。

因此,虽然您的代码本质上没有任何问题,但您应该首先考虑是否真的需要循环引用。可能还有其他更简洁的方式来表示您的数据。

【讨论】:

    【解决方案2】:

    如果您需要循环引用,只需在逻辑上使用它们,它们没有错(例如,带有子节点和父节点的树节点也会导致 CR)。

    在某些情况下,CR 可能会很痛苦,但并不严重:

    • 序列化:默认二进制序列化可以正确处理它们,但可能会导致序列化整个图,而不管您真正想要序列化的节点是什么。您可能希望使用一些自定义来避免此类问题。 XML、json 和其他类型的序列化也可以考虑类似的考虑因素。
    • 垃圾收集:在从某个地方至少引用一个节点之前,您的对象图不会被释放。如果您想逐个释放对象,请确保在删除时正确取消链接,或将它们设为一次性,这会删除对已释放对象的所有引用。

    【讨论】:

      猜你喜欢
      • 2023-04-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-04-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-10-26
      相关资源
      最近更新 更多