C#通过引用分配属性

时间:2019-06-05 12:38:12

标签: c# object reference

可以说我具有以下类结构:

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进行初始化,但是它不会更新子引用,因此我认为它不是由引用分配的。

1 个答案:

答案 0 :(得分:2)

您的自定义类NewClassList<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.