Язык программирования C#9 и платформа .NET5 - Троелсен Эндрю - Страница 145
- Предыдущая
- 145/642
- Следующая
Несмотря на то что сами вы можете выяснить, что ссылка
object
Employee
<i>(класс_к_которому_нужно_привести) существующая_ссылка</i>
Таким образом, чтобы передать переменную типа
object
GivePromotion()
// Правильно!
GivePromotion((Manager)frank);
Использование ключевого слова as
Имейте в виду, что явное приведение оценивается во время выполнения, а не на этапе компиляции. Ради иллюстрации предположим, что проект
Employees
Hexagon
class Hexagon
{
public void Draw()
{
Console.WriteLine("Drawing a hexagon!");
}
}
Хотя приведение объекта сотрудника к объекту фигуры абсолютно лишено смысла, код вроде показанного ниже скомпилируется без ошибок:
// Привести объект frank к типу Hexagon невозможно,
// но этот код нормально скомпилируется!
object frank = new Manager();
Hexagon hex = (Hexagon)frank;
Тем не менее, вы получите ошибку времени выполнения, или более формально — исключение времени выполнения. В главе 7 будут рассматриваться подробности структурированной обработки исключений, а пока полезно отметить, что при явном приведении можно перехватывать возможные ошибки с применением ключевых слов
try
catch
// Перехват возможной ошибки приведения.
object frank = new Manager();
Hexagon hex;
try
{
hex = (Hexagon)frank;
}
catch (InvalidCastException ex)
{
Console.WriteLine(ex.Message);
}
Очевидно, что показанный пример надуман; в такой ситуации вас никогда не будет беспокоить приведение между указанными типами. Однако предположим, что есть массив элементов
System.Object
Employee
Employee
Для быстрого определения совместимости одного типа с другим во время выполнения в C# предусмотрено ключевое слово
as
as
null
// Использование ключевого слова as для проверки совместимости.
object[] things = new object[4];
things[0] = new Hexagon();
things[1] = false;
things[2] = new Manager();
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,
- Предыдущая
- 145/642
- Следующая