更新C#中对象列表中的对象

时间:2017-11-08 06:21:20

标签: c# .net list c#-4.0

我有一个像这样的功能

public class Component
{
  public List<SubComponent1> subComponent1 {get;set;}
  public List<SubComponent2> subComponent2 {get;set;}
}


public void Update()
{
  List<Component> collection = new List<Component> collection();

  //populate from service
  collection = getData();

  //I want to update subComponent1 
  List<SubComponent1> copycomp = null;

  copycomp = collection.subComponent1;

  UpdateService1Data(ref copycomp);

 }

public void UpdateService1Data(ref List<SubComponent1> subcopy)
{
  //Do some operations and update SubComponent1
   //Changes will reflect in collection object
}

我的问题是这样的:

Update()函数中copycomp指的是collection变量中的对象,因此对copycomp变量所做的任何更改都不需要分配它回到这样的集合:

service.subComponent1 = copycomp ;

因为它是类类型并且引用相同的对象。

但我将相同的引用传递给UpdateService1Data(),那为什么我需要使用 ref 关键字?为什么我不能传递变量?如果更新适用于更新功能,那么为什么它无法在 UpdateService1Data ()中使用。我将它可视化为参考或 SubComponent1 类的地址在每个地方传递copycomp?

1 个答案:

答案 0 :(得分:1)

  

在Update()函数中,copycomp引用其中的对象   集合变量,因此对copycomp变量进行了任何更改   不需要像以下那样将其分配回集合:

copycomp的值是对象collection.subComponent1的引用,它是List<SubComponent1>。当您调用方法并将copycomp作为参数传递(不使用ref)时,您实际传递了此引用的副本,这是C#中的默认行为在许多其他高级编程语言中。因此,您仍然可以引用原始对象,并且可以更改其中的任何值。特别是在您的情况下,您可以从列表中删除项目,添加其他项目,更改项目的属性值等。

如果您希望以上内容不需要ref关键字。如果要更改ref保留的引用,则应使用copycomp关键字,然后将新引用用于其他目的。在这种情况下,您可以执行前面提到的任何操作,这将导致copycomp指向的对象状态的突变,除此之外,您甚至可以更改copycomp持有的实际引用。