new Rectangle {TopLeft = new Point { X = 10, Y = 10 },

                 BottomRight = new Point { X = 200, Y = 200}},

  new Rectangle {TopLeft = new Point { X = 2, Y = 2 },

                 BottomRight = new Point { X = 100, Y = 100}},

  new Rectangle {TopLeft = new Point { X = 5, Y = 5 },

                 BottomRight = new Point { X = 90, Y = 75}}

};

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

<p id="AutBody_Root480">Лямбда-выражения</p>

Лямбда-операция C# (=>) подробно рассматривалась в главе 12. Вспомните, что данная операция позволяет строить лямбда-выражение, которое может применяться в любой момент при вызове метода, требующего строго типизированный делегат в качестве аргумента. Лямбда-выражения значительно упрощают работу с делегатами, т.к. сокращают объем кода, который должен быть написан вручную. Лямбда-выражения могут быть представлены следующим образом:

АргументыДляОбработки =>

{

  ОбрабатывающиеОператоры

}

В главе 12 было показано, как взаимодействовать с методом FindAll() обобщенного класса List с использованием трех разных подходов. После работы с низкоуровневым делегатом Predicate и анонимным методом C# мы пришли к приведенной ниже (исключительно компактной) версии, в которой использовалось лямбда-выражение:

static void LambdaExpressionSyntax()

{

  // Создать список целочисленных значений.

  List list = new List();

  list.AddRange(new int[] { 20, 1, 4, 8, 9, 44 });

  // Теперь использовать лямбда-выражение С#.

  List evenNumbers = list.FindAll(i => (i % 2) == 0);

  // Вывести четные числа

  Console.WriteLine("Here are your even numbers:");

  foreach (int evenNumber in evenNumbers)

   {

    Console.Write("{0}\t", evenNumber);

  }

  Console.WriteLine();

}

Лямбда-выражения будут удобны при работе с объектной моделью, лежащей в основе LINQ. Как вы вскоре выясните, операции запросов LINQ в C# — просто сокращенная запись для вызова методов класса по имени System.Linq.Enumerable. Эти методы обычно всегда требуют передачи в качестве параметров делегатов (в частности, делегата Funс<>), которые применяются для обработки данных с целью выдачи корректного результирующего набора. За счет использования лямбда-выражений можно упростить код и позволить компилятору вывести нужный делегат. 

<p id="AutBody_Root481">Расширяющие методы</p>

Расширяющие методы C# позволяют оснащать существующие классы новой функциональностью без необходимости в создании подклассов. Кроме того, расширяющие методы дают возможность добавлять новую функциональность к запечатанным классам и структурам, которые в принципе не допускают построения подклассов. Вспомните из главы 11, что когда создается расширяющий метод, первый его параметр снабжается ключевым словом this и помечает расширяемый тип. Также вспомните, что расширяющие методы должны всегда определяться внутри статического класса, а потому объявляться с применением ключевого слова static. Вот пример:

namespace MyExtensions

{

  static class ObjectExtensions

  {

    // Определить расширяющий метод для System.Object.

    public static void DisplayDefiningAssembly(

      this object obj)

    {

      Console.WriteLine("{0} lives here:\n\t->{1}\n", obj.GetType().Name,

        Assembly.GetAssembly(obj.GetType()));

    }

  }

}

Чтобы использовать такое расширение, приложение должно импортировать пространство имен, определяющее расширение (и возможно добавить ссылку на внешнюю сборку). Затем можно приступать к написанию кода:

// Поскольку все типы расширяют System.Object, все

// классы и структуры могут использовать это расширение.

int myInt = 12345678;

myInt.DisplayDefiningAssembly();

Перейти на страницу:

Похожие книги