Могу ли я рассчитывать на то, что LINQ ToArray () всегда возвращает новый экземпляр? - PullRequest
21 голосов
/ 20 мая 2011

Я ищу простой способ клонирования параметра IEnumerable<T> для дальнейшего использования. * Расширение LINQ ToArray кажется хорошим и лаконичным способом сделать это.

Однако мне не ясно, всегда ли гарантированно возвращать новый экземпляр массива. Несколько методов LINQ будут проверять фактический тип перечисляемого и ярлык, если это возможно; например, Count() увидит, реализует ли метод ICollection<T>, и, если это так, непосредственно прочитает его свойство Count; он выполняет итерацию коллекции, только если это необходимо.

Учитывая тот подход к короткому замыканию, где это практически осуществимо, кажется, что если я вызову ToArray() для чего-то, что уже является массивом, ToArray() может закорачивать и просто возвращать тот же массив пример. Это технически соответствует требованиям ToArray метода.

Из быстрого теста выясняется, что в .NET 4.0 вызов ToArray() для массива возвращает новый экземпляр. У меня вопрос: могу ли я на это положиться? Могу ли я гарантировать, что ToArray всегда будет возвращать новый экземпляр, даже в Silverlight и в будущих версиях .NET Framework? Есть ли где-нибудь документация, которая проясняет этот вопрос?

Ответы [ 2 ]

25 голосов
/ 20 мая 2011

Да, ToArray всегда будет возвращать новый массив - изменение в нем, чтобы вернуть существующее значение, было бы ужасным изменением, и я совершенно убежден, что команда .NET не сделает этого.Это важная вещь, на которую можно положиться.Жаль, что это не задокументировано: (

В LINQ to Objects есть много тонких битов поведения, на которые, вероятно, не стоит полагаться, но в данном случае это массивное немного поведения, я был бы совершенно удивлен, чтобы это изменилось.

Короткое замыкание - это здорово, когда оно не влияет на поведение, но в целом LINQ to Objects довольно хорош только для оптимизации вдействительные случаи. Возможно, вы захотите взглянуть на две публикации в моей серии статей по оптимизации Edulinq.

15 голосов
/ 20 мая 2011

Поскольку этот метод ToArray является внутренним для инфраструктуры .NET, я бы не стал ставить свою жизнь на MS, никогда не меняя ее. Однако я хотел бы добавить модульный тест, утверждающий, что ToArray возвращает новый экземпляр массива.

Assert.AreNotSame(myArray, myArray.ToArray());

Таким образом, если вы позже измените версии .NET Framework, вы автоматически узнаете, изменились ли функциональные возможности.

...