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

ЖАНРЫ

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

}

}

Здесь производится проход в цикле по всем элементам в массиве объектов и проверка каждого из них на совместимость с классом

Hexagon
. Метод
Draw
вызывается, если (и только если) обнаруживается объект, совместимый с
Hexagon
. В противном случае выводится сообщение о том, что элемент несовместим.

Использование ключевого слова is (обновление в версиях 7.0, 9.0)

В дополнение к ключевому слову

as
язык C# предлагает ключевое слово
is
,
предназначенное для определения совместимости типов двух элементов. Тем не менее, в отличие от ключевого слова
as
, если типы не совместимы, тогда ключевое слово
is
возвращает
false
, а не ссылку
null
. В текущий момент метод
GivePromotion
спроектирован для приема любого возможного типа, производного от
Employee
. Взгляните на следующую его модификацию, в которой теперь осуществляется проверка, какой конкретно "тип сотрудника" был передан:

static void GivePromotion(Employee emp)

{

Console.WriteLine("{0} was promoted!", emp.Name);

if (emp is SalesPerson)

{

Console.WriteLine("{0} made {1} sale(s)!", emp.Name,

((SalesPerson)emp).SalesNumber);

Console.WriteLine;

}

else if (emp is Manager)

{

Console.WriteLine("{0} had {1} stock options...", emp.Name,

((Manager)emp).StockOptions);

Console.WriteLine;

}

}

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

SalesPerson
или
Manager
, можно применить явное приведение, чтобы получить доступ к специализированным членам данного типа. Также обратите внимание, что помещать операции приведения внутрь конструкции
try/catch
не обязательно, т.к. внутри раздела
if
, выполнившего проверку условия, уже известно, что приведение безопасно.

Начиная с версии C# 7.0, с помощью ключевого слова

is
переменной можно также присваивать объект преобразованного типа, если приведение работает. Это позволяет сделать предыдущий метод более ясным, устраняя проблему "двойного приведения". В предшествующем примере первое приведение выполняется, когда производится проверка совпадения типов, и если она проходит успешно, то переменную придется приводить снова. Взгляните на следующее обновление предыдущего метода:

static void GivePromotion(Employee emp)

{

Console.WriteLine("{0} was promoted!", emp.Name);

// Если SalesPerson, тогда присвоить переменной s

if (emp is SalesPerson s)

{

Console.WriteLine("{0} made {1} sale(s)!", s.Name,

s.SalesNumber);

Console.WriteLine;

}

// Если Manager, тогда присвоить
переменной m

else if (emp is Manager m)

{

Console.WriteLine("{0} had {1} stock options...",

m.Name, m.StockOptions);

Console.WriteLine;

}

}

В версии C# 9.0 появились дополнительные возможности сопоставления с образцом (они были раскрыты в главе 3). Такое обновленное сопоставление с образцом можно использовать с ключевым словом

is
. Например, для проверки, что объект сотрудника не относится ни к классу
Manager
, ни к классу
SalesPerson
, применяйте следующий код:

if (emp is not Manager and not SalesPerson)

{

Console.WriteLine("Unable to promote {0}. Wrong employee type", emp.Name);

Console.WriteLine;

}

Использование отбрасывания вместе с ключевым словом is (нововведение в версии 7.0)

Ключевое слово

is
также разрешено применять в сочетании с заполнителем для отбрасывания переменных. Вот как можно обеспечить перехват объектов всех типов в операторе
if
или
switch
:

if (obj is var _)

{

// Делать что-то

}

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

GivePromotion
:

if (emp is SalesPerson s)

{

Console.WriteLine("{0} made {1} sale(s)!", s.Name, s.SalesNumber);

Console.WriteLine;

}

// Если Manager, тогда присвоить переменной m

else if (emp is Manager m)

{

Console.WriteLine("{0} had {1} stock options...", m.Name, m.StockOptions);

Console.WriteLine;

}

else if (emp is var _)

{

// Некорректный тип сотрудника

Console.WriteLine("Unable to promote {0}. Wrong employee type", emp.Name);

Console.WriteLine;

}

Финальный оператор

if
будет перехватывать любой экземпляр
Employee
, не являющийся
Manager
,
SalesPerson
или
PtSalesPerson
. Не забывайте, что вы можете приводить вниз к базовому классу, поэтому
PtSalesPerson
будет регистрироваться как
SalesPerson
.

Еще раз о сопоставлении с образцом (нововведение в версии 7.0)

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