如何将列表移交给类并在类的实例中使用该列表的副本

问题描述 投票:0回答:1

请参阅下面的代码示例:

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 constructor
1个回答
0
投票

在 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
的更改不会影响传递给构造函数的原始列表。

您不需要在代码中显式删除或清除列表,除非您想释放关联的内存。当列表不再被引用时,垃圾收集器将回收内存。

© www.soinside.com 2019 - 2024. All rights reserved.