Программирование >>  Программирование с использованием ajax 

1 ... 127 128 129 [ 130 ] 131 132 133 ... 396


либо такого:

тип имя переменной = значение;

В следующем коде сразу видно, к какому типу относится переменная mylnt:

int mylnt = 5;

Console.WriteLine(mylnt);

Еще можно удостовериться, что IDE-среде тоже известно о типе переменной, просто наведя курсор мыши на идентификатор переменной (рис. 14.3).

mt mylnt = 5;

Соп5о1е.WriteLine(raynt);

(local variable) int mylnt

Puc. 14.3. Идентификация переменной my Int

В C# 3.0 появилось новое ключевое слово var, которое можно использовать в качестве альтернативного варианта, т.е. вместо ключевого слова type в предыдущем коде:

var varName = значение;

Здесь переменная varName неявным образом приводится к типу значение. Обратите внимание, что никакого типа с именем var не существует. В строке кода

var myVar = 5;

ПОД my Var подразумевается переменная типа int, а не переменная типа var. Опять-таки, как показано на рис. 14.4, IDE-среде известно и об этом.

var rayVar = 5;

Сопсоie.WriteLine(rayvjr);

(local variable) int myVar

Puc. 14.4. Идентификация переменной my Var

Этот момент является чрезвычайно важным. Использование var не означает объявления переменной без типа или даже переменной с типом, который может изменяться. Если бы это было так, язык С# не являлся бы более строго типизированным. А означает это лишь то, что ответственным за определение типа переменной назначается компилятор.

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

var myVar;

Еще ключевое слово var может применяться для выведения (infer) типа массива посредством его инициализатора:

var myArray = new [] {4, 5, 2};

В этом коде массиву myArray неявным образом назначается тип int [ ].



При неявном задании типа массива подобным образом, элементы массива, используемые в инициализаторе, должны:

□ либо все относится к одинаковому типу;

а либо все относится к одинаковому ссылочному типу или равняться null;

□ либо все представлять собой элементы, которые могут быть неявно приведены к одному типу.

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

var myArray = new [ ] {4, not an int , 2};

Также обратите внимание на то, что числовые значения никогда не интерпретируются как нулевые типы, поэтому следующий код тоже не будет компилироваться:

var myArray = new [ ] {4, null, 2 } ;

Чтобы добиться такого поведения, однако, можно использовать стандартный инициализатор массива:

var myArray = new int?[] {4, null, 2};

И, напоследок, обратите внимание на то, что идентификатор var вовсе не запрещено использовать в именах классов. Это значит, что, например, при наличии в области видимости (в том же пространстве имен или в том пространстве имен, на которое имеется ссылка) класса с именем var, применять метод неявного задания типа с использованием ключевого слова var нельзя.

Сам по себе механизм выводимости типов (type inference) не является особо полезным, потому что, например, в коде, который приводился в данном разделе, он лишь все усложняет. Использование ключевого слова var затрудняет мгновенное распознавание типа, к которому относится та или иная переменная. Однако, как будет показано позже в этой главе, понятие выводимых типов является важным, поскольку лежит в основе других механизмов. Следующий рассматриваемый механизм, например - механизм анонимных типов - является одним из тех, в которых выводимые типы играют существенную роль.

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

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

public class Curry {

public string Mainlngredient (get; set;} public string Style {get; set;} public int Spiciness {get; set;}

Этот класс ничего фактически не делает - он просто хранит структурированные данные. В базе данных или электронной таблице он мог бы просто представлять ка-



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

Анонимные типы предлагают способ для упрощения этой модели программирования. В частности, они позволяют не определять никаких простых типов для хранения данных, а использовать вместо этого компилятор С# для автоматического создания типов на базе данных, которые в них нужно хранить.

Например, экземпляр показанного выше типа класса Curry можно создать следующим образом:

Curry curry = new Curry { Mainlngredient = Lamb , Style = Dhansak , Spiciness = 5 };

В качестве альтернативного варианта можно использовать для этого и анонимный тип, как показано ниже:

var curry = new { Mainlngredient = Lamb , Style = Dhansak , Spiciness = 5 };

Здесь видны два отличия. Во-первых, используется ключевое слово var. Объясняется это тем, что у анонимных типов нет идентификатора, который можно было бы использовать разработчику. На самом деле, на внутреннем уровне у них все-таки есть идентификатор, как очень скоро будет показано, но для использования разработчиком в своем коде он не доступен. Во-вторых, никакое имя для типа после ключевого слова new не указывается. Именно благодаря этому компилятор и узнает, что требуется использовать анонимный тип.

ШЕ-среда распознает определение анонимного типа и соответствующим образом обновляет данные IntelliSense. В случае приведенного выше объявления анонимный тип будет отображаться так, как показано на рис. 14.5.

var curry - new { Hainlngredient - Lvrir , Style - Dhinsik , Spiciness - 5 ); curry{

< Convert

Cro AppDom inD legite J rtoi

4 Cwry Jo.

f J Dit MijiiigneaExcept>on Dittbme DiternneKind

Oocal variable) a curry

Artonymous Types a Is new {string Main

t.stnng Style, int Spiciness)!

Puc. 14.5. Отображение в IntelliSense данных об анонимном типе

Здесь, на внутреннем уровне, видно, что тип переменной curry выглядит как а. Очевидно, что использовать такое обозначение в своем коде нельзя, поскольку оно не является даже допустимым именем идентификатора. - это просто символ, которым в IntelliSense обозначаются анонимные типы. Еще IntelliSense позволяет инспектировать данные членов анонимного типа, как показано на рис. 14.6.

var curry - new ( Hainlngredient -curry.)

Style - Dhaneak , Spiciness - 5 };

Ф Equili

GetHeshCode

GetType

Mainlngredient

Spianesj

String a Style

♦ ToStnng

Anonymous Types

a is new{ string Mainlngredient. stnng Style, int Spiciness }

Puc. 14.6. Отображение в IntelliSense данных о членах анонимного типа



1 ... 127 128 129 [ 130 ] 131 132 133 ... 396

© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки.
Яндекс.Метрика