Имейте в виду, что неявная типизация локальных переменных дает в результате var
в языке C# — не тот же самый прием, который используется в сценарных языках (вроде JavaScript или Perl). Кроме того, ключевое слово var
— это не тип данных Variant
в СОМ, когда переменная на протяжении своего времени жизни может хранить значения разных типов (что часто называют
На заметку! В C# поддерживается возможность динамической типизации с применением ключевого слова dynamic
. Вы узнаете о таком аспекте языка в главе 18.
Взамен средство выведения типов сохраняет аспект строгой типизации языка C# и воздействует только на объявление переменных при компиляции. Затем данные трактуются, как если бы они были объявлены с выведенным типом; присваивание такой переменной значения другого типа будет приводить к ошибке на этапе компиляции.
static void ImplicitTypingIsStrongTyping
{
// Компилятору известно, что s имеет тип System.String.
var s = "This variable can only hold string data!";
s = "This is fine...";
// Можно обращаться к любому члену лежащего в основе типа.
string upper = s.ToUpper;
// Ошибка! Присваивание числовых данных строке не допускается!
s = 44;
}
Полезность неявно типизированных локальных переменных
Теперь, когда вы видели синтаксис, используемый для объявления неявно типизируемых локальных переменных, вас наверняка интересует, в каких ситуациях его следует применять. Прежде всего, использование var
для объявления локальных переменных просто ради интереса особой пользы не принесет. Такой подход может вызвать путаницу у тех, кто будет изучать код, поскольку лишает возможности быстро определить лежащий в основе тип данных и, следовательно, затрудняет понимание общего назначения переменной. Поэтому если вы знаете, что переменная должна относиться к типу int
, то сразу и объявляйте ее с типом int
!
Однако, как будет показано в начале главы 13, в наборе технологий LINQ применяются subset
в следующем примере кода LINQ?
static void LinqQueryOverInts
{
int[] numbers = { 10, 20, 30, 40, 1, 2, 3, 8 };
// Запрос LINQ!
var subset = from i in numbers where i < 10 select i;
Console.Write("Values in subset: ");
foreach (var i in subset)
{
Console.Write("{0} ", i);
}
Console.WriteLine;
// К какому же типу относится subset?
Console.WriteLine("subset is a: {0}", subset.GetType.Name);
Console.WriteLine("subset is defined in: {0}",
subset.GetType.Namespace);
}
Вы можете предположить, что типом данных subset
будет массив целочисленных значений. Но на самом деле он представляет собой низкоуровневый тип данных LINQ, о котором вы вряд ли что-то знаете, если только не работаете с LINQ длительное время или не откроете скомпилированный образ в утилите ildasm.exe
. Хорошая новость в том, что при использовании LINQ вы редко (если вообще когда-либо) беспокоитесь о типе возвращаемого значения запроса; вы просто присваиваете значение неявно типизированной локальной переменной.
Фактически можно было бы даже утверждать, что var
полностью оправдано, является определение данных, возвращаемых из запроса LINQ. Запомните, если вы знаете, что нужна переменная int
, то просто объявляйте ее с типом int
! Злоупотребление неявной типизацией в производственном коде (через ключевое слово var
) большинство разработчиков расценивают как плохой стиль кодирования.
Работа с итерационными конструкциями C#
Бьерн Страуструп , Бьёрн Страуструп , Валерий Федорович Альмухаметов , Ирина Сергеевна Козлова
Программирование, программы, базы данных / Базы данных / Программирование / Учебная и научная литература / Образование и наука / Книги по IT