我有一个像这样的功能
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?
答案 0 :(得分:1)
在Update()函数中,copycomp引用其中的对象 集合变量,因此对copycomp变量进行了任何更改 不需要像以下那样将其分配回集合:
copycomp
的值是对象collection.subComponent1
的引用,它是List<SubComponent1>
。当您调用方法并将copycomp
作为参数传递(不使用ref
)时,您实际传递了此引用的副本,这是C#中的默认行为在许多其他高级编程语言中。因此,您仍然可以引用原始对象,并且可以更改其中的任何值。特别是在您的情况下,您可以从列表中删除项目,添加其他项目,更改项目的属性值等。
如果您希望以上内容不需要ref
关键字。如果要更改ref
保留的引用,则应使用copycomp
关键字,然后将新引用用于其他目的。在这种情况下,您可以执行前面提到的任何操作,这将导致copycomp
指向的对象状态的突变,除此之外,您甚至可以更改copycomp
持有的实际引用。