Герберт Шилдт - C# 4.0: полное руководство
- Название:C# 4.0: полное руководство
- Автор:
- Жанр:
- Издательство:ООО И.Д. Вильямс
- Год:2011
- Город:Москва -- Киев
- ISBN:978-5-8459-1684-6
- Рейтинг:
- Избранное:Добавить в избранное
-
Отзывы:
-
Ваша оценка:
Герберт Шилдт - C# 4.0: полное руководство краткое содержание
В этом полном руководстве по C# 4.0 - языку программирования, разработанному специально для среды .NET, - детально рассмотрены все основные средства языка: типы данных, операторы, управляющие операторы, классы, интерфейсы, методы, делегаты, индексаторы, события, указатели, обобщения, коллекции, основные библиотеки классов, средства многопоточного программирования и директивы препроцессора. Подробно описаны новые возможности C#, в том числе PLINQ, библиотека TPL, динамический тип данных, а также именованные и необязательные аргументы. Это справочное пособие снабжено массой полезных советов авторитетного автора и сотнями примеров программ с комментариями, благодаря которым они становятся понятными любому читателю независимо от уровня его подготовки.
Книга рассчитана на широкий круг читателей, интересующихся программированием на C#.Введите сюда краткую аннотацию
C# 4.0: полное руководство - читать онлайн бесплатно ознакомительный отрывок
Интервал:
Закладка:
Несмотря на всю полезность логического заключения о типе данных, в некоторых случаях приходится явно указывать тип параметра лямбда-выражения. Для этого достаточно ввести конкретное название типа данных. В качестве примера ниже приведен другой способ объявления экземпляра делегата
incr
.
Incr incr = (int count) => count + 2;
Как видите, count теперь явно объявлен как параметр типа
int
. Обратите также внимание на использование скобок. Теперь они необходимы. (Скобки могут быть опущены только в том случае, если задается лишь один параметр, а его тип явно не указывается.)
В предыдущем примере в обоих лямбда-выражениях использовался единственный параметр, но в целом у лямбда-выражений может быть любое количество параметров, в том числе и нулевое. Если в лямбда-выражении используется несколько параметров, их необходимо заключить в скобки. Ниже приведен пример использования лямбда-выражения с целью определить, находится ли значение в заданных пределах.
(low, high, val) => val >= low && val <= high;
А вот как объявляется тип делегата, совместимого с этим лямбда-выражением.
delegate bool InRange(int lower, int upper, int v);
Следовательно, экземпляр делегата
InRange
может быть создан следующим образом.
InRange rangeOK = (low, high, val) => val >= low && val <= high;
После этого одиночное лямбда-выражение может быть выполнено так, как показано ниже.
if(rangeOK(1, 5, 3)) Console.WriteLine(
"Число 3 находится в пределах от 1 до 5.");
И последнее замечание: внешние переменные могут использоваться и захватываться в лямбда-выражениях таким же образом, как и в анонимных методах.
Блочные лямбда-выражения
Как упоминалось выше, существуют две разновидности лямбда-выражений. Первая из них, одиночное лямбда-выражение, была рассмотрена в предыдущем разделе. Тело такого лямбда-выражения состоит только из одного выражения. Второй разновидностью является блочное лямбда-выражение. Для такого лямбда-выражения характерны расширенные возможности выполнения различных операций, поскольку в его теле допускается указывать несколько операторов. Например, в блочном лямбда-выражении можно использовать циклы и условные операторы
if
, объявлять переменные и т.д. Создать блочное лямбда-выражение нетрудно. Для этого достаточно заключить тело выражения в фигурные скобки. Помимо возможности использовать несколько операторов, в остальном блочное лямбда-выражение, практически ничем не отличается от только что рассмотренного одиночного лямбда-выражения.
Ниже приведен пример использования блочного лямбда-выражения для вычисления и возврата факториала целого значения.
// Продемонстрировать применение блочного лямбда-выражения,
using System;
// Делегат IntOp принимает один аргумент типа int
// и возвращает результат типа int.
delegate int IntOp(int end);
class StatementLambdaDemo {
static void Main() {
// Блочное лямбда-выражение возвращает факториал
// передаваемого ему значения.
IntOp fact = n => {
int r = 1;
for (int i=1; i <= n; i++)
r = i * r;
return r;
};
Console.WriteLine("Факториал 3 равен " + fact(3));
Console.WriteLine("Факториал 5 равен " + fact(5));
}
}
При выполнении этого кода получается следующий результат.
Факториал 3 равен 6
Факториал 5 равен 120
В приведенном выше примере обратите внимание на то, что в теле блочного лямбда-выражения объявляется переменная r, организуется цикл
for
и используется оператор return
. Все эти элементы вполне допустимы в блочном лямбда-выражении. И в этом отношении оно очень похоже на анонимный метод. Следовательно, многие анонимные методы могут быть преобразованы в блочные лямбда-выражения при обновлении унаследованного кода. И еще одно замечание: когда в блочном лямбда-выражении встречается оператор return
, он просто обусловливает возврат из лямбда-выражения, но не возврат из охватывающего метода.
И в заключение рассмотрим еще один пример, демонстрирующий блочное лямбда-выражение в действии. Ниже приведен вариант первого примера из этой главы, измененного с целью использовать блочные лямбда-выражения вместо автономных методов для выполнения различных операций со строками.
// Первый пример применения делегатов, переделанный с
// целью использовать блочные лямбда-выражения.
using System;
// Объявить тип делегата,
delegate string StrMod(string s);
class UseStatementLambdas {
static void Main() {
// Создать делегаты, ссылающиеся на лямбда- выражения,
// выполняющие различные операции с символьными строками.
// Заменить пробелы дефисами.
StrMod ReplaceSpaces = s => {
Console.WriteLine("Замена пробелов дефисами.");
return s.Replace(' ', '-');
};
// Удалить пробелы.
StrMod RemoveSpaces = s => {
string temp = "";
int i;
Console.WriteLine("Удаление пробелов.");
for(i=0; i < s.Length; i++)
if(s[i] != ' ') temp += s[i];
return temp;
};
// Обратить строку.
StrMod Reverse = s => {
string temp = ""; int i, j;
Console.WriteLine("Обращение строки.");
for(j=0, i=s.Length-1; i >= 0; i--, j++) temp += s[i];
return temp;
};
string str;
// Обратиться к лямбда-выражениям с помощью делегатов.
StrMod strOp = ReplaceSpaces;
str = strOp("Это простой тест.");
Console.WriteLine("Результирующая строка: " + str);
Console.WriteLine() ;
strOp = RemoveSpaces;
str = strOp("Это простой тест.");
Console.WriteLine("Результирующая строка: " + str);
Console.WriteLine();
strOp = Reverse;
str = strOp("Это простой тест.");
Console.WriteLine("Результирующая строка: " + str);
Интервал:
Закладка: