可以说我具有以下类结构:
public class NewClass
{
public string Name{get;set;}
public Int Age{get;set;}
}
public class ChildClass
{
public List<NewClass> NewClassList {get;set;}
//SomeOther properties
}
public class ParentClass
{
public List<NewClass> NewClassList {get;set;}
public List<ChildClass> ChildClassList {get;set;}
}
我的目标是让ChildClass.NewClassList
引用ParentClass.NewClassList
中的值
我想这样做是因为Child类的每个实例都需要访问ParentClass.NewClassList
中保存的信息,但是ParentClass.ChildClassList
可能是一个很大的列表,所以我不想保存副本-我希望它引用持有的值。
此外,如果我这样做:
var firstParent = new ParentClass
{
ChildClassList = new List<ChildClass> {//lots of entries},
NewClassList = new List<NewClass>()
}
然后,在我的代码的更下方,我想为firstParent.NewClassList
分配一个值,并希望它自动填充子列表中的所有值。
我希望一切都清楚吗?
编辑:
我已编辑NewClassList
进行初始化,但是它不会更新子引用,因此我认为它不是由引用分配的。
答案 0 :(得分:2)
您的自定义类NewClass
和List<T>
都是引用类型。
来自Microsoft's documentation on Reference Types:
C#中有两种类型:引用类型和值类型。引用类型的变量存储对其数据(对象)的引用,而值类型的变量直接包含其数据。 对于引用类型,两个变量可以引用同一对象;因此,对一个变量的操作可能会影响另一个变量引用的对象。对于值类型,每个变量都有自己的数据副本,并且对一个变量的操作不可能影响另一个变量(除非对于in,ref和out参数变量;请参阅in,ref和out参数修饰符。
[我的重点]
因此,要完成您想要做的所有事情,就是将每个孩子的NewClassList
属性分配给其父母的NewClassList
。
var firstParent = new ParentClass
{
NewClassList = new List<NewClass>(),
ChildClassList = new List<ChildClass>()
};
firstParent.ChildClassList.Add(new ChildClass
{
NewClassList = firstParent.NewClassList
});
firstParent.ChildClassList.Add(new ChildClass
{
NewClassList = firstParent.NewClassList
});
firstParent.NewClassList.Add(new NewClass
{
Name = "Hugh Mann",
Age = 48
});
//firstParent and both children now contain Hugh Mann.
firstParent.ChildClassList[0].NewClassList.Add(new NewClass
{
Name = "Sillius Soddus",
Age = 43
});
//firstParent and both children now contain Sillius Soddus.
firstParent.ChildClassList[1].NewClassList.Add(new NewClass
{
Name = "Joanna Dance",
Age = 62
});
//firstParent and both children now contain Joanna Dance.
firstParent.NewClassList[0].Age = 23;
//Hugh Mann now has an age of 23 in firstParent and its children
如果要为父母或孩子分配一个不同的列表,他们将不再引用相同的列表。对一个列表的更改不会在另一列表上发生,因为它们引用的是完全不同的列表。
var firstParent = new ParentClass
{
NewClassList = new List<NewClass>(),
ChildClassList = new List<ChildClass>()
};
firstParent.ChildClassList.Add(new ChildClass
{
NewClassList = firstParent.NewClassList
});
firstParent.ChildClassList[0].NewClassList.Add(new NewClass
{
Name = "Sillius Soddus",
Age = 43
});
//firstParent and its child now contain Sillius Soddus.
firstParent.NewClassList = new List<NewClass>
{
new NewClass
{
Name = "Hugh Mann",
Age = 22
}
};
//firstParent.NewClassList now references a totally different list. It contains Hugh Mann, while firstParent.ChildClassList[0] contains Sillius Soddus.
firstParent.NewClassList.Add(new NewClass
{
Name = "Ian D. Dark",
Age = 33
});
//firstParent.NewClassList now contains Hugh Mann and Ian D. Dark. Since firstParent.ChildClassList[0] references a totally different list it still only contains Sillius Soddus.