Дополнения в .NET-языках версии 2008

Оценить
(0 голоса)

.NET-языки получили некоторые улучшения в результате обновлений, сделанных в Common Language Runtime (CLR). Несмотря на то, что имеется несколько специфических улучшений как для Visual Basic, так и для С#, большинство улучшений версии 2008 применимы к обоим языкам. Поэтому мы описываем языковые улучшения одной группой и даем примеры на обоих языках. Если данное дополнение специфично для конкретного языка, то это будет отмечено. Языковые улучшения .NET-языков включают следующее:

□    локальный вывод типа (называемое также неявным типизированием);

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

□    методы расширения;

□    анонимные типы;

□    лямбда-выражения;

□    частичные методы;

□    встроенный язык запросов (LINQ);

□    дружественные сборки;

□    поддержка языка XML (только для VB);

□    неиспользуемые аргументы событий (только для VB);

□    автоматически реализованные свойства (только для С#).

Многие из этих новых языковых функций служат для поддержки новой важной функцио­нальной возможности— встроенного языка запросов (LINQ), который мы также описыва­

ем здесь (и вообще по всей этой книге). Однако каждая функциональная возможность языка полезна и сама по себе, и ее следует четко понимать. Поэтому каждая возможность подроб­но описана в следующих разделах. Примеры приводятся как на С#, так и на VB.

Выведение типа данных переменной на основе присваивания

В последних версиях Visual Basic и C# вы можете определять переменные без явного указа­ния их типа данных. При этом вы по-прежнему можете иметь преимущества строго типизи­рованных переменных (проверка компилятора, выделение памяти и т. д.). Компиляторы бы­ли улучшены для того, чтобы выводить тип данных на основе вашего кода. Этот процесс называется выведением локального типа (local type inference) или неявным типизированием (implicit typing).

В качестве примера рассмотрим следующие строки кода. Здесь вы создаете переменную типа string и присваиваете значение.

□    С#:

string companyName = "Contoso";

□    VB:

Dim companyName As String = "Contoso"

Теперь давайте рассмотрим эту же строку при помощи выведения типа. Вы можете заметить, что вам не нужна описательная часть декларации. Вместо нее компилятор может сам опреде­лить, что вам нужна строка, и строго типизировать для вас эту переменную. В языке C# это происходит при помощи нового ключевого слова var. Его не следует путать с оператором var в таких языках, как JavaScript. Переменные, определенные как var, будут строго типизирова­ны. В VB по-прежнему просто используете оператор Dim, но опускаете тип данных.

'□ С#:

var companyName = "Contoso";

□    VB:

Dim companyName = "Contoso"

Эти две строки кода эквивалентны во всех отношениях. Несмотря на то, что во втором при­мере тип данных не объявлялся, он объявляется компилятором. Это не является возвратом к универсальному типу данных (такому как Variant или object). Не является это также и поздним связыванием переменной. Это просто более умный компилятор, который строго типизирует переменную, выбирая тип данных в зависимости от кода. Вы получаете все пре­имущества переменных с ранним связыванием (и экономите количество нажатий клавиш).

Например, посмотрим на рис. 3.2. Это компилятор VB в действии (компилятор C# делает то же самое). Вы можете видеть, что даже на стадии разработки компилятор определил, что эта переменная имеет тип System. String.

Есть несколько вещей, которые необходимо знать при использовании выведения типа. Пер­вое — это то, что вашей локальной переменной для типизации компилятором должно быть присвоено значение. Это не должно быть большой проблемой, поскольку если значение ва­шей переменной не присваивается, то она и не используется.

Второе — выведение типа работает только с локальными типами. Оно не работает с пе­ременными уровня класса (называемыми также полями) или статическими переменными. В этих случаях использование выведения локального типа приведет к ошибке компилято­ра языка С#. В VB вы получите такую же ошибку, если опция Option strict установле­на в On. Если вы не используете эту опцию в вашем коде на VB, то переменная не будет строго типизирована. Вместо этого переменной будет присвоен универсальный тип дан­ных Ob j ect.

Выведение локального типа может быть полезным и в других вариантах деклараций, в том числе: определение массивов, создание переменных во время циклов, определение перемен­ной внутри оператора Using, а также определение переменной, которая содержит результат вызова функции. В каждом из этих случаев компилятор может вывести тип ваших данных из контекста кода. Еще один пример— следующий код создает оператор Using и выводит тип переменной спп.

□    С#:

using (var cnn = new System.Data.SqlClient.SqlConnection()) {

// Код для работы с подключением

}

□    VB:

Using cnn = New System.Data.SqlClient.SqlConnection 1 Код для работы с подключением End Using

Дополнения в .NET-языках версии 2008

В Visual Basic вы можете включить или отключить выведение локального типа для данного файла. По умолчанию в новом файле кода VB выведение типа разрешается. Однако если вы хотите выключить его на уровне файла, то вы можете сделать это путем указания Option infer Off в начале файла.

Создание объекта и настройка его свойств одной строкой кода

Теперь существует короткий способ для объявления экземпляра класса и настройки началь­ных значений для всех (или некоторых) его членов. Одной строкой кода вы можете создать экземпляр объекта и настроить свойства этого объекта. На стадии выполнения объект будет сначала создан, а затем будут настроены его свойства (в том порядке, в котором они появ­ляются в списке инициализации). Эта новая функциональная возможность называется ини­циализаторами объекта (object initializers).

Рассмотрим пример. Предположим, что у вас есть класс Employee, который имеет несколь­ко свойств вроде FirstName, LastName, FullName, Title и т. д. При помощи инициализа­ции объектов вы можете создать экземпляр этого класса и настроить начальные значения некоторых (или всех) свойств экземпляра Employee. Для этого вы сначала конструируете объект. В языке Visual Basic сразу за конструированием следует ключевое слово with (в языке C# ничего такого не нужно). Затем вы помещаете каждую инициализацию свойства в фигурные скобки. Вот примеры:

□    С#:

Employee emp = new Employee { FirstName = "Joe",

LastName = "Smith", Title = "Sr. Developer" };

□    VB:

Dim emp As New Employee With {.FirstName = "Joe", _

.LastName = "Smith", .Title = "Sr. Developer"}

Эти строки кода являются эквивалентом строки создания класса Employee и нескольких строк кода для каждого из перечисленных свойств. Обратите внимание, что в VB вам нужно перед инициализацией поставить ключевое слово with, а для доступа к каждому свойству используется точка. В языке C# вам не нужны ни точка, ни ключевое слово.

Конечно, вы можете использовать инициализацию объектов и с параметризированными конструкторами. Вы просто передаете параметры в конструктор (как обычно). Затем следом за конструктором вы делаете инициализацию. Предположим, что класс Employee имел кон­структор, который принимал имя и фамилию. Вы можете создать объект с параметрами и использовать инициализацию объекта для Title, как показано здесь:

□    С#:

Employee emp = new Employee("Joe", "Smith")

{ Title = "Sr. Developer" };

□    VB:

Dim emp As New Employee("Joe", "Smith") With _

{.Title = "Sr. Developer"}

Инициализация объектов позволяет вам также писать код внутри инициализации. Кроме того, в VB вы можете использовать свойства объекта (который вы инициализируете) для того, чтобы помочь инициализировать другие свойства. В языке C# это недопустимо. Ком­пилятор C# не позволяет вам получить доступ к переменной до завершения присваивания. Для примера следующий код инициализирует объект Employee и настраивает свойство Employee. FullName при помощи конкатенации имени и фамилии. Обратите внимание, что в коде VB используется сам объект.

□    С#:

Employee emp = new Employee { FirstName = "Joe",

LastName = "Smith", -FullName = "Joe" + " Smith"};

□    VB:

Dim emp As New Employee () With {.FirstName = "Joe", __

.LastName = "Smith", _

.FullName = .FirstName & " " & .LastName}

Вы можете также делать вложенную инициализацию объекта. То есть если данное свойство представляет другой объект, то вы можете создать этот другой объект как часть инициали­зации. Вы можете также вложить инициализацию второго объекта в инициализацию перво­го объекта. Простой пример все прояснит. Предположим, что класс Employee имеет свой­ство Location. Это свойство может указывать на объект Location, который содержит свойства city и state. Теперь вы можете создать объект Employee (вместе с вложенным объектом Location) так, как показано здесь:

□    С#:

Employee emp = new Employee { FirstName = "Joe",

LastName = "Smith", Location = new Location { City = "Redmond", State = "WA" } };

□    VB:

Dim emp As New Employee!) With {.FirstName = "Joe", _

.LastName = "Smith", _

.Location = New Location With _

{.City = "Redmond", .State = "Washington"}}

Добавление методов в существующие классы
Создание экземпляра несуществующего класса
Добавление бизнес-логики в сгенерированный код
Разбиение сборки на несколько файлов
Работа с XML непосредственно в коде

Добавить комментарий


Защитный код
Обновить

© 2017 www.visualstudios.ru. Все права защищены.