请参阅下面的代码示例:
Main Program:
List<MyObject> _listofmyobjects = new();
for (int i = 0; i <= 1000; i++)
{
_listofmyobjects.Add(new MyObject(i));
}
var test = new Test(_list);
public class Test
{
List<MyObject>_obj = new(); //-> Variant 1
List<MyObject>_obj; //-> Variant 2
public Test(List<MyObject> arglist)
{
_obj = arglist;
}
public void DoSth()
{
//Work with _obj inside instance of Test, get and set properties of _obj
}
}
我并不是 100% 清楚变体 1 和变体 2 之间的区别是什么。 两种变体都有效。
但我想确保在类 Test 中我只使用通过构造函数移交的列表的副本。
还不清楚我是否必须删除 odr 清除代码中某处的列表或通过 _obj = new() 重置它。
在 C# 中,对象是引用类型。当您将
List<MyObject>
传递给 Test
的构造函数时,您传递的是对原始列表的引用,而不是副本。变体 1 和变体 2 在这种情况下本质上表现相似。
在变体 1 中:
List<MyObject> _obj = new(); // Initialization and assignment
在变体 2 中:
List<MyObject> _obj; // Declaration
两种变体都在构造函数中初始化列表,并且在这两种情况下,
_obj
字段将引用构造函数中传递的相同列表实例。
如果您想确保在
Test
类中使用列表的副本并且不修改原始列表,您可以创建一个新列表并从原始列表复制元素。您可以使用 List<T>
复制构造函数或 LINQ 的 ToList
方法。
示例:
public class Test
{
List<MyObject> _obj;
public Test(List<MyObject> arglist)
{
_obj = new List<MyObject>(arglist); // Create a new list and copy elements
}
public void DoSth()
{
// Work with _obj inside the instance of Test, get and set properties of _obj
}
}
这确保了 Test 类中对
_obj
的更改不会影响传递给构造函数的原始列表。
您不需要在代码中显式删除或清除列表,除非您想释放关联的内存。当列表不再被引用时,垃圾收集器将回收内存。