C# Уроки: Операторы is и as, массивы указателей

Массивы указателей на базовый класс

Для создания массива указателей на базовый класс используется обобщенный список (List<T>). Рассмотрим пример с базовым классом Animal и производными классами Dog и Cat. Для работы с List<T> необходимо подключить пространство имен System.Collections.Generic.

using System.Collections.Generic;

// ... определения классов Animal, Dog, Cat ...

List<Animal> animals = new List<Animal>();
animals.Add(new Dog { Speed = 12.23f, Name = "Alex" });
animals.Add(new Dog { Speed = 15.5f, Name = "Bob" });
animals.Add(new Cat { Name = "Meow" });

Объекты, добавленные в animals, являются указателями на базовый класс Animal. Доступны только методы, определенные в Animal. Методы, специфичные для Dog или Cat, недоступны напрямую через переменную типа Animal.

Для перебора элементов массива используется цикл foreach:

foreach (Animal animal in animals)
{
    Console.WriteLine(animal.Name);
    if (animal is Dog dog)
    {
        Console.WriteLine(dog.Speed);
    }
}

Доступ к свойству Speed возможен только после проверки типа объекта оператором is.

Оператор is

Оператор is проверяет, принадлежит ли объект к определенному типу или его подтипу. Он возвращает true, если объект совместим с указанным типом, и false в противном случае.

bool isDog = animal is Dog;
Console.WriteLine(isDog); // Выведет true или false в зависимости от типа animal

animal is Dog вернет true только если animal — объект класса Dog или его подкласса.

Оператор as

Оператор as пытается преобразовать объект к указанному типу. В отличие от is, он не вызывает исключение при неудачном преобразовании, а возвращает null.

Dog dog = animal as Dog;
if (dog != null)
{
    Console.WriteLine(dog.Speed);
}

animal as Dog вернет объект типа Dog, если animal — объект класса Dog, и null в противном случае. Это позволяет избежать исключений при преобразовании типов.

Операторы is и as — мощные инструменты для работы с полиморфизмом и проверкой типов объектов в C#. is используется для проверки типа объекта, а as — для безопасного преобразования типов без риска исключений. List<T> позволяет создавать гибкие массивы, содержащие объекты различных типов, производных от общего базового класса.

Что будем искать? Например,программа