Чтение онлайн

ЖАНРЫ

Язык программирования C#9 и платформа .NET5
Шрифт:

// Ошибка! Должно быть присвоено значение!

var myData;

// Ошибка! Значение должно присваиваться в самом объявлении!

var myInt;

myInt = 0;

// Ошибка! Нельзя присваивать null в качестве начального значения!

var myObj = null;

Тем не менее, присваивать

null
локальной переменной, тип которой выведен в результате начального присваивания, разрешено (при
условии, что это ссылочный тип):

// Допустимо, если SportsCar имеет ссылочный тип!

var myCar = new SportsCar;

myCar = null;

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

// Также нормально!

var myInt = 0;

var anotherlnt = myInt;

string myString = "Wake up!";

var myData = myString;

Кроме того, неявно типизированную локальную переменную разрешено возвращать вызывающему коду при условии, что возвращаемый тип метода и выведенный тип переменной, определенной посредством

var
, совпадают:

static int GetAnlntO

{

var retVal = 9;

return retVal;

}

Неявно типизированные данные строго типизированы

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

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
) большинство разработчиков расценивают как плохой стиль кодирования.

Поделиться с друзьями: