2017-02-23 70 views
2

Я пересматривал код и позволял ReSharper немного помогать мне. Я получил этот кусок кода:Разница между 'как dynamic []' и ToArray()

IEnumerable<dynamic> records = ...; 
ScheduleTemplateInfo[] resultTemplateInfos = new ScheduleTemplateInfo[records.Count()]; 

Здесь он предупредил меня, что там может быть Possible multiple enumeration of IEnumerable. Так что пусть ReSharper рефакторинг, и он дал мне это:

IEnumerable<dynamic> records = ...; 
dynamic[] recordsAsArray = records as dynamic[] ?? records.ToArray(); 
ScheduleTemplateInfo[] resultTemplateInfos = new ScheduleTemplateInfo[recordsAsArray.Length]; 

Теперь, я полагаю, что выглядит более эффективным на первый взгляд. Однако мне интересна вторая строка, которая была вставлена.

В чем разница между литейными записями as dynamic[] и ведения записей .ToArray()? Является ли более эффективным, чем другой? Более надежный?

+1

'.ToArray()' создает новый массив, а затем копирует все элементы. Если 'records' уже является массивом, то это работа, которую не нужно делать, поэтому они пытаются напрямую применить ее к' dynamic [] '. –

ответ

2

records начинается как IEnumerable<dynamic>. Это означает, что на самом деле это может быть все, что реализует IEnumerable<dynamic>, включая массив. Вместо этого он может быть List<dynamic>, или один из дюжины других типов коллекций.

Он хочет создать dynamic[]. Если records уже типа dynamic[], то records as dynamic[] будет бросить его и вернуть. Если нет, это конкретное выражение вернет null, в результате чего оператор нулевой коалесценции (??) вернет правую часть.

Это правая рука работает метод LINQ .ToArray() на любой тип records случается, который превратит его в dynamic[] и потенциально включает в себя намного больше работы, чем простой бросок.

В зависимости от того, что происходит на самом деле здесь, вы можете быть в состоянии изменить вещи немного самостоятельно - например, если вы знаете, что ...; часть никогда возвращает dynamic[], вы можете также просто records.ToArray() без проверки литом ,