3

我遇到了以下 C# 函数:

    void SomeMethod(List<ISomeInterface> inputObjects)
    {
        IList<ISomeInterface> newListOfObjects = null;

        if (inputObjects != null)
        {
            //create a new list
            newListOfObjects = new List<ISomeInterface>();
            //copy the input parameter into the new list
            foreach (ISomeInterface thing in inputObjects)
            {
                newListOfObjects.Add(thing);
            }
        }
        //send an event to another module with the new list as parameter
        DelegateHandler.AsyncInvoke(this.SomeEvent, newListOfObjects);
    }   

我的问题是:是否有必要创建一个对象作为 SomeEvent 的参数?如果我只是将 inputObjects 作为参数传递给 SomeEvent 会发生什么?
我猜可能垃圾收集器不会看到对 inputObjects 的引用,并且会在 SomeMethod 完成时将其删除。

4

3 回答 3

1

您的问题不是很清楚,但是内部使用的数据结构AsyncInvoke将根对象并确保在this.SomeEvent返回之前不会收集它(在另一个线程上)。

于 2013-05-15T13:11:54.707 回答
1

没有必要复制列表。垃圾收集器将知道对象本身仍在使用中,并且不会被垃圾收集。

传递副本和原始文件的区别在于,如果您传递原始文件,则对列表的任何修改也将在调用方法中可见,否则仅对副本进行修改

于 2013-05-15T13:12:59.823 回答
1

当您将元素从一个列表复制到另一个列表时,您会在原始列表中保留相同的元素引用(如果它们是引用类型)。

于 2013-05-15T13:16:27.027 回答