Array.ToArray <>() возвращает исходный массив, если он является одним и тем же типом?

Я работаю с каркасом на ежедневной основе, где мы иногда предоставляем методы, которые принимают IEnumerable<MyBusinessObject> в качестве параметра, чтобы показывать пользовательские интерфейсы, выполнять вычисления и т.д.

Если я передаю массив из MyBusinessObject так:

MyBusinessObject[] myArray = new MyBusinessObject { obj1, obj2, ..., objN };
frameworkClass.MyMethod(myArray);

....

public class FrameworkClass
{
    public void MyMethod(IEnumerable<MyBusinessObject> objs)
    {
        // Other code that uses the enumerable
        MyBusinessObject[] objectArray = objs.ToArray();            
        // More code that uses the enumerable
    }
}

Ли строка objs.ToArray() просто разрешает IEnumerable<MyBusinessObject> вернуться к исходному массиву или скопирует его в совершенно новый массив, готовый к использованию?

Ответ 1

Нет, вы будете всегда получать новую копию массива, хотя объекты в ней не являются копиями, они являются теми же ссылками, что и в исходном массиве.

Было бы очень непоследовательно, если бы изменения в возвращаемом массиве иногда влияли на источник, а иногда и нет. ToList работает по той же причине.


Вы можете проверить исходный код (по состоянию на 2015 год), если вам нужно просмотреть детали: Enumerable.ToArray, который, в свою очередь, создает копию элементов ( оптимизирован для ICollection и, следовательно, Array[], но все еще делает копию) с внутренним классом буфера.