C# 虚拟ICollection
在c中# 这是有效的编程吗 我在想,既然t1链接到t2,t2链接到t1,因此它也链接回它自己,它会占用更多的空间吗?或者它是一个危险的算法/代码吗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>
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和其他类型的序列化也可以考虑类似的考虑
- 垃圾收集:只有从某处引用至少一个节点,才会释放对象图。如果要逐个释放对象,请确保在移除时正确断开它们的链接,或使它们成为一次性对象,这将移除对已处置对象的所有引用
- 序列化:默认二进制序列化可以正确处理它们,但可能会导致序列化整个图形,而不管您真正想要序列化的节点是什么。您可能希望使用一些定制来避免此类问题。XML、json和其他类型的序列化也可以考虑类似的考虑
- 垃圾收集:只有从某处引用至少一个节点,才会释放对象图。如果要逐个释放对象,请确保在移除时正确断开它们的链接,或使它们成为一次性对象,这将移除对已处置对象的所有引用