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

Я ежедневно работаю с платформой, в которой мы иногда предоставляем методы, которые принимают 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 Ответ

55 голосов
/ 19 января 2010

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

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


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

...