Опубликован: 13.10.2008 | Уровень: специалист | Доступ: платный
Лекция 4:

С# 3.0

< Лекция 3 || Лекция 4: 12 || Лекция 5 >

Инициализаторы объектов и коллекций

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

Инициализаторы объектов

Инициализатор объекта содержит последовательность инициализаторов свойств или полей объекта, заключенную в фигурные скобки. При этом нельзя инициализировать свойство или поле более одного раза. Свойство типа-значения не может быть инициализировано в инициализаторе объекта. Пусть есть класс, описывающий точку:

public class Point
{
int x, y;
public int X { get { return x; } set { x = value; } }
public int Y { get { return y; } set { y = value; } }
}

Пример инициализации экземпляра класса точки с помощью инициализатора объекта:

var a = new Point { X = 0, Y = 1 }

Это эквивалентно:

var a = new Point(); a.X = 0 a.Y = 1

Инициализаторы коллекций

Инициализатор коллекции аналогичен инициализатору объекта. Для устранения путаницы с инициализатором объекта инициализаторы элементов коллекции не могут содержать знака присваивания. Пример инициализации:

List<int> digits = new List<int> { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 }

Объект-коллекция, созданный инициализатором коллекции, должен иметь тип, реализующий интерфейс System.Collections.Generic.ICollection<T> только для одного типа T. Более того, для каждого инициализатора элемента коллекции должно существовать неявное преобразование его типа к T, иначе происходит ошибка компиляции.

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

Анонимные типы

C# 3.0 позволяет использовать оператор new с анонимным инициализатором объекта. При этом создается объект анонимного типа. Анонимный тип — это класс без имени (имя генерируется компилятором автоматически и не может быть использовано в коде), унаследованный от object. Члены анонимного класса — последовательность свойств с доступом read/write, полученные из списка инициализатора объекта. Если выражение, инициализирующее объект анонимного типа, имеет тип null, происходит ошибка компиляции. Если два инициализатора анонимных объектов содержат абсолютно одинаковые выражения инициализации (имена и порядок свойств), создаются объекты одного типа. Например:

var p1 = new { Name = "Lawnmower", Price = 495.00 } 
var p2 = new { Name = "Shovel", Price = 26.95 } 
p1 = p2

Выражения, содержащие запросы

С# 3.0 поддерживает синтаксис для создания запросов, аналогичных запросам на языках иерархических и реляционных баз данных (например, языки SQL и XQuery).

Запрос начинается с from- и заканчивается select- или group- выражением. За исходным from - выражением может идти 0 и более from- или where - выражений. Итоговое select - или group - выражение задает форму результата в виде переменных для последующей итерации. Перед select или group может быть конструкция orderby, задающая порядок группирования результата. Into - выражение используется для создания подзапросов. Пример использования:

using System
using System.Query
using System.Collections.Generic
class app {
 static void Main() 
 {
  string[] names = { "Burke", "Connor", "Frank"
                     "Everett", "Albert",  "George" 
                     "Harris", "David"}
  IEnumerable<string> expr = from s in names
  where s.Length == 5
  orderby s
  select s.ToUpper()
  foreach (string item in expr) Console.WriteLine(item) 
 }
}

Деревья выражений

Деревья выражений позволяют представить лямбда-выражения в виде структур данных, а не исполнимого кода. Лямбда-выражение, которое преобразуется в тип-делегат D, также может быть преобразовано в дерево выражений типа System.Query.Expression<D>. Преобразование лямбда-выражений в тип-делегат порождает исполнимый код, на который ссылается делегат. Преобразование лямбда-выражений в дерево выражений порождает код, создающий экземпляр дерева выражений. Деревья выражений представляют собой эффективное представление лямбда-выражений в памяти и делают структуру выражения более прозрачной. Пример выражения в виде кода и дерева выражений:

Func<int,int> f = x => x + 1;                    // Code
Expression<Func<int,int>> e = x => x + 1;  // Data

Делегат f ссылается на метод, возвращающий x+1, а дерево выражений e ссылается на структуру данных, описывающую выражение x+1.

Итоги

C# 3.0 представляет собой расширения C# 2.0. В него входят:

  • неявно типизированные локальные переменные;
  • неявно типизированные массивы;
  • расширяющие методы;
  • лямбда-выражения;
  • анонимные типы;
  • выражения, содержащие запросы;
  • деревья выражений.

Эти расширения позволяют быстрее осваивать C# тем, кто с ним не работал ранее. Кроме того, C# 3.0 предоставляет специалистам, знакомым с массой тонкостей, еще более гибкие и мощные средства. Разумеется, став более гибким, C# требует от разработчиков большего внимания к использованию своих средств, чтобы не допустить ошибок.

< Лекция 3 || Лекция 4: 12 || Лекция 5 >
Ринат Гатауллин
Ринат Гатауллин

Здравствуйте. Интересует возможность получения диплома( https://intuit.ru/sites/default/files/diploma/examples/P/955/Nekommerch-2-1-PRF-example.jpg ). Курс пройден. Сертификат не подходит. В сертификате ошибка, указано по датам время прохождения около 14 дней, хотя написано 576 часов.

Вячеслав Кузнецов
Вячеслав Кузнецов

Здравствуйте.

Как оплатить курс?

Дмитрий Черкасов
Дмитрий Черкасов
Россия, Москва
Иван Герасимов
Иван Герасимов
Россия, калининград, Балтийский институт экономики и финансов, 2013