Почему существует только статическая / совместно используемая версия ForEach для массивов? - PullRequest
0 голосов
/ 18 августа 2011

Может быть, кто-нибудь проявит любезность и объяснит, почему существует только статическая / совместно используемая версия ForEach для массивов?

IE: ForEach<T>(T array[], System.Action(Of T) action[])

Я предполагаю, что это как-то связано с требованиями вывода типа реализации экземпляраметод, но когда вы объявляете свой массив, вы предоставляете тип правильно?

Ответы [ 2 ]

4 голосов
/ 18 августа 2011

Одна проблема с массивами состоит в том, что негде документировать методы экземпляров, которые доступны только для "векторов" . «Вектор» - это одномерный массив с базой 0, поэтому все, что в C # можно представить как T[], является вектором, а, например, T[,] - нет.

Это означает, что не каждый экземпляр Array должен иметь метод - и даже если бы он имел, как бы вы представляли T? Каждый тип массива является отдельным, и в .NET нет универсального типа, который является базовым классом для всех массивов. Все, что у нас есть, это Array.

Итак, учитывая, что мы должны ввести параметр типа где-то в системе типов, и учитывая, что мы также ограничиваем его «векторными» типами, статический метод кажется подходящим обходным путем.

Обратите внимание, что это не в случае с List<T>, где у нас уже есть параметр типа, поэтому мы можем создать простой метод экземпляра.

Также стоит подумать, когда использование Array.ForEach на самом деле заканчивается более чистым кодом, чем просто использование цикла foreach. Я бы обычно использовал его, только когда у меня уже есть делегат для выполнения на каждом элементе. В противном случае языковая конструкция выглядит чище, и она, безусловно, более гибкая в своей способности возвращаться или выходить из цикла без исключения.

0 голосов
/ 18 августа 2011

Вы предоставляете T, чтобы указать, что массив может содержать в нем.Так как Array реализует ienumerable, следовательно, он получает метод расширения ForEach.

Есть ли что-то еще, что вы ищете?

Хотите знать, поможет ли пост Erics вам http://blogs.msdn.com/b/ericlippert/archive/2009/05/18/foreach-vs-foreach.aspx

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...