C# Language
Возможности C # 3.0
Поиск…
замечания
Версия C # 3.0 была выпущена как часть .Net версии 3.5. Многие из функций, добавленных в эту версию, поддерживались LINQ (языковые INtegrated Queries).
Список дополнительных функций:
- LINQ
- Лямбда-выражения
- Методы расширения
- Анонимные типы
- Неявно типизированные переменные
- Инициализаторы объектов и коллекций
- Автоматически реализованные свойства
- Деревья выражений
Неявно введенные переменные (var)
Ключевое слово var
позволяет программисту неявно вводить переменную во время компиляции. объявления var
имеют тот же тип, что и явно объявленные переменные.
var squaredNumber = 10 * 10;
var squaredNumberDouble = 10.0 * 10.0;
var builder = new StringBuilder();
var anonymousObject = new
{
One = SquaredNumber,
Two = SquaredNumberDouble,
Three = Builder
}
Типы вышеперечисленных переменных - это int
, double
, StringBuilder
и анонимный тип соответственно.
Важно отметить, что переменная var
не является динамически типизированной. SquaredNumber = Builder
недействителен, так как вы пытаетесь установить int
в экземпляр StringBuilder
Языковые интегрированные запросы (LINQ)
//Example 1
int[] array = { 1, 5, 2, 10, 7 };
// Select squares of all odd numbers in the array sorted in descending order
IEnumerable<int> query = from x in array
where x % 2 == 1
orderby x descending
select x * x;
// Result: 49, 25, 1
Пример из статьи в Википедии на C # 3.0, подраздел LINQ
В примере 1 используется синтаксис запроса, который был спроектирован так, чтобы выглядеть аналогично SQL-запросам.
//Example 2
IEnumerable<int> query = array.Where(x => x % 2 == 1)
.OrderByDescending(x => x)
.Select(x => x * x);
// Result: 49, 25, 1 using 'array' as defined in previous example
Пример из статьи в Википедии на C # 3.0, подраздел LINQ
В примере 2 используется синтаксис метода для достижения того же результата, что и в примере 1.
Важно отметить, что в C # синтаксис запроса LINQ представляет собой синтаксический сахар для синтаксиса метода LINQ. Компилятор переводит запросы в вызовы методов во время компиляции. Некоторые запросы должны быть выражены в синтаксисе метода. Из MSDN - «Например, вы должны использовать вызов метода для выражения запроса, который извлекает количество элементов, которые соответствуют указанному условию».
Lambda expresions
Lambda Expresions - это расширение анонимных методов, которые допускают неявно типизированные параметры и возвращаемые значения. Их синтаксис менее подробный, чем анонимный, и следует за функциональным стилем программирования.
using System;
using System.Collections.Generic;
using System.Linq;
public class Program
{
public static void Main()
{
var numberList = new List<int> {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
var sumOfSquares = numberList.Select( number => number * number )
.Aggregate( (int first, int second) => { return first + second; } );
Console.WriteLine( sumOfSquares );
}
}
Вышеприведенный код выводит сумму квадратов от 1 до 10 на консоль.
Первое лямбда-выражение квадратизирует числа в списке. Поскольку существует только одна скобка параметра, ее можно опустить. Вы можете включить скобки, если хотите:
.Select( (number) => number * number);
или явно введите параметр, но затем требуются скобки:
.Select( (int number) => number * number);
Тело лямбда является выражением и имеет неявное возвращение. Вы можете использовать тело оператора, если хотите. Это полезно для более сложных лямбдов.
.Select( number => { return number * number; } );
Метод select возвращает новый IEnumerable с вычисленными значениями.
Второе лямбда-выражение суммирует числа в списке, возвращаемом методом select. Скобки необходимы, поскольку существует несколько параметров. Типы параметров явно напечатаны, но это необязательно. Следующий метод эквивалентен.
.Aggregate( (first, second) => { return first + second; } );
Как и этот:
.Aggregate( (int first, int second) => first + second );
Анонимные типы
Анонимные типы предоставляют удобный способ инкапсулировать набор свойств только для чтения в один объект без необходимости явно определять тип в первую очередь. Имя типа генерируется компилятором и не доступно на уровне исходного кода. Тип каждого свойства определяется компилятором.
Вы можете создавать анонимные типы, используя new
ключевое слово, за которым следует фигурная скобка ( {
) . Внутри фигурных фигурных скобок вы можете определить свойства, подобные приведенному ниже.
var v = new { Amount = 108, Message = "Hello" };
Также возможно создать массив анонимных типов. См. Следующий код:
var a = new[] {
new {
Fruit = "Apple",
Color = "Red"
},
new {
Fruit = "Banana",
Color = "Yellow"
}
};
Или используйте его с запросами LINQ:
var productQuery = from prod in products
select new { prod.Color, prod.Price };