Программирование >>  Программирование с использованием ajax 

1 ... 134 135 136 [ 137 ] 138 139 140 ... 396


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

Далее идет последняя перегрузка метода Aggregate (). Она принимает три параметра обобщенного типа и отличается от предыдущей версии только тем, что позволяет, чтобы тип возвращаемого значения не совпадал ни с типом элементов в массиве, ни с типом значения аккумулятора. Первым делом такая перегрузка используется для конкатенации строковых элементов с начальной строкой:

Console.WriteLine(curries.Aggregate<string, string, string>( Some curries: , (a, b) => a + + b, a => a));

Последний параметр этого метода, а именно - параметр resultSelector, должен задаваться даже в том случае, если (как и в рассматриваемом примере) значение аккумулятора просто копируется в результат. Этот параметр представляет собой лямбда-выражение типа Func<TAccumulate, TResult>.

В последнем разделе кода та же самая версия Aggregate () используется снова, но на этот раз с возвращаемым значением int. Здесь параметр resultSelector предоставляется с лямбда-выражением, которое возвращает длину строки аккумулятора:

Console.WriteLine(curries.Aggregate<string, string, int> ( Some curries: , (a, b) => a + + b, a => a.Length));

Ничего зрелищного в этом примере нет, но зато он демонстрирует то, как можно использовать более сложные методы расширения, обладающие параметрами обобщенного типа, коллекциями и, очевидно, более сложным синтаксисом. Такие методы будут еще не раз встречаться далее в этой книге.

Резюме

В настоящей главе были рассмотрены новые средства, которые появились в версии С# 3.0, предлагаемой для использования в средах Visual Studio 2008 и Visual С# Express Edition 2008. Здесь было рассказано о том, как эти средства могут упрощать написание части кода, требуемого для достижения определенных наиболее часто используемых и/или развитых функциональных возможностей.

Далее перечислены ключевые моменты, с которыми вы ознакомились в этой главе.

□ Как использовать инициализаторы объектов и коллекции для создания экземпляров и инициализации объектов и коллекций за один шаг.

а Как ШЕ-среда и компилятор С# умеют выводить типы из контекста и как использовать ключевое слово var для вынуждения их применять механизм выведения типов с переменными любого типа.

□ Как создавать и использовать анонимные типы, которые подразумевают применение и уже упомянутых инициализаторов, и механизма выведения типов.

□ Как создавать методы расширения, которые можно вызывать для экземпляров других типов без добавления какого-либо кода в определение этих типов, и как этой методикой пользоваться для предоставления библиотек вспомогательных методов.



□ Как использовать лямбда-выражения для предоставления анонимных методов экземплярам делегатов и как расширенный синтаксис лямбда-методов позволяет получить дополнительную функциональность.

Большинство из тех средств С#, о которых говорилось в этой главе, было добавлено специально с расчетом на применение вместе с новой технологией LINQ, которая появилась в .NET Framework. Степень элегантности и многие тонкие детали показанного в этой главе кода станут очевидными лишь позже. Несмотря на это, некоторые рассмотренные здесь приемы являются настолько мощными, что их можно незамедлительно начинать применять на практике для совершенствования своих навыков программирования на С#.

Вот и подошло к концу изучение языка С# в том виде, в котором он предлагается в версии 3.0. Для программирования с использованием .NET Framework, однако, одних только знаний С# не достаточно. Язык С# обеспечивает лишь всеми средствами, которые необходимы для написания .NET-приложений, а классы, доступные в .NET Framework, предоставляют исходный материал, с которого необходимо начинать разработку. Поэтому, начиная с этого момента, в настоящей книге будет много внимания уделяться именно этим классам и демонстрироваться, как с их помощью можно решать массу различных задач. Со следующей главы мы прекратим использовать консольные приложения, с которыми постоянно приходилось иметь дело ранее, и начнем применять богатые функциональные возможности, предлагаемые приложениями Windows Forms для создания графических пользовательских интерфейсов. При этом нужно будет помнить, что базовые принципы выглядят для всех типов приложений одинаково. Навыки, приобретенные в первой части книги, очень хорошо помогут при изучении материала последующих глав.

Упражнения

1. Почему нельзя использовать инициализатор объектов с показанным ниже классом? После изменения данного класса так, чтобы он допускал использование инициализатора объектов, приведите пример кода, который вы бы применили для создания экземпляра и инициализации этого класса за один шаг

public class Giraffe {

public Giraffe (double neckLength, string name) {

NeckLength = neckLength; Name = name;

public double NeckLength {get; set;) public string Name {get; set;}

2. Верно ли то, что в случае объявления переменной типа var ее можно будет использовать для хранения объектов любого типа?

3. В случае использования анонимных типов, как можно выполнить сравнение двух экземпляров для выяснения того, содержатся ли в них одинаковые данные?

4. Попробуйте исправить код следующего метода расширения, в котором присутствует ошибка:



public string ToAcronym (this string inputString) {

inputString = inputString.Trim () ;

if (inputString == )

return ;

string[] inputStringAsArray = inputString.Split( );

StringBuilder sb = new StringBuilder ();

for (int i = 0; i < InputStringAsArray.Length; i++)

if (inputStringAsArray[i].Length > 0) {

sb.AppendFormat ( {0} , inputStringAsArray[i].Substring (0, 1).ToUpper());

return sb.ToString0;

5. Как сделать так, чтобы метод расширения в четвертом упражнении был точно доступен клиентскому коду?

6. Перепишите показанный здесь метод ToAcronym так, чтобы его код занимал одну строку. В этом коде должна обеспечиваться гарантия того, что строки с множеством пробелов между словами не будут приводить к ошибкам.

Подсказка: для этого потребуется тернарная операция ? :, функция расширения string.Aggregate<string, string>() и лямбда-выражение.



1 ... 134 135 136 [ 137 ] 138 139 140 ... 396

© 2006 - 2024 pmbk.ru. Генерация страницы: 0.001
При копировании материалов приветствуются ссылки.
Яндекс.Метрика