C# 虚拟ICollection

C# 虚拟ICollection,c#,virtual,icollection,C#,Virtual,Icollection,在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>

在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;
    }
}
static void Main(字符串[]args)
{
试验t1=新试验(1);
试验t2=新试验(2);
试验t3=新试验(3);
试验t4=新试验(4);
t1.Links=新列表();
t1.链接。添加(t2);
t2.Links=新列表();
t2.链接。添加(t1);
Console.WriteLine(t1.Links.First().Links.First().id);
Console.Read();
返回;
}
公开课考试
{
公共int id{get;set;}
公共虚拟ICollection链接{get;set;}
公共测试(int-Id)
{
id=id;
}
}

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

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


所以,虽然代码本身没有什么问题,但您应该首先考虑是否确实需要循环引用。可能还有其他更干净的方法来表示数据。

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


所以,虽然代码本身没有什么问题,但您应该首先考虑是否确实需要循环引用。可能还有其他更干净的方法来表示数据。

如果需要循环引用,只需在逻辑上使用它们,它们没有什么问题(例如,具有子级的树节点和父级原因也有CRs)

在某些情况下,CRs可能是一种疼痛,但并不严重:

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

如果需要循环引用,只需在逻辑上使用循环引用,循环引用没有问题(例如,带有子节点和父节点的树节点也会导致CRs)

在某些情况下,CRs可能是一种疼痛,但并不严重:

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

您试图用该对象树归档的内容可能存在重复?如果您的问题需要具有循环引用的数据结构,则可以创建这样的数据结构。。。里面没有什么危险;)就像@JanDotNet刚刚说的,里面没有什么不好的。你可以通过创建一个更好的结构来保证时间/空间的安全。你可以在这里找到一张绝对安全的名单。。。但这实际上取决于您想要归档的内容。是否可能与您试图用该对象树归档的内容重复?如果您的问题需要具有循环引用的数据结构,则可以创建这样的数据结构。。。里面没有什么危险;)就像@JanDotNet刚刚说的,里面没有什么不好的。你可以通过创建一个更好的结构来保证时间/空间的安全。你可以在这里找到一张绝对安全的名单。。。但这实际上取决于您要归档的内容。