things[3] = "Last thing";
foreach (object item in things)
{
Hexagon h = item as Hexagon;
if (h == null)
{
Console.WriteLine("Item is not a hexagon"); // item - не Hexagon
}
else
{
h.Draw();
}
}
Здесь производится проход в цикле по всем элементам в массиве объектов и проверка каждого из них на совместимость с классом Hexagon
Draw()
вызывается, если (и только если) обнаруживается объект, совместимый с Hexagon
. В противном случае выводится сообщение о том, что элемент несовместим.Использование ключевого слова is (обновление в версиях 7.0, 9.0)
В дополнение к ключевому слову as
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 _)
{
// Делать что-то
}