Опубликован: 13.10.2008 | Доступ: свободный | Студентов: 1719 / 224 | Оценка: 4.22 / 3.70 | Длительность: 09:12:00
ISBN: 978-5-9963-0003-7
Лекция 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 часов.

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

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

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