s.SalesNumber);
break;
case Manager m:
Console.WriteLine("{0} had {1} stock options...",
emp.Name, m.StockOptions);
break;
}
Console.WriteLine;
}
Когда к оператору case
when, для использования доступно полное определение объекта SalesNumber существует только в классе SalesPerson, но не в классе Employee. Если приведение в первом операторе case проходит успешно, то переменная s будет содержать экземпляр класса SalesPerson, так что оператор case можно было бы переписать следующим образом:case SalesPerson s when s.SalesNumber > 5:
Такие новые добавления к is
switch обеспечивают удобные улучшения, которые помогают сократить объем кода, выполняющего сопоставление, как демонстрировалось в предшествующих примерах.Использование отбрасывания вместе с операторами switch (нововведение в версии 7.0)
Отбрасывание также может применяться в операторах switch
switch (emp)
{
case SalesPerson s when s.SalesNumber > 5:
Console.WriteLine("{0} made {1} sale(s)!", emp.Name,
s.SalesNumber);
break;
case Manager m:
Console.WriteLine("{0} had {1} stock options...",
emp.Name, m.StockOptions);
break;
case Employee _:
// Некорректный тип сотрудника
Console.WriteLine("Unable to promote {0}. Wrong employee type", emp.Name);
break;
}
Каждый входной тип уже является Employee
case всегда дает true. Однако, как было показано при представлении сопоставления с образцом в главе 3, после сопоставления оператор switch завершает работу Это демонстрирует важность правильности порядка. Если финальный оператор case переместить в начало, тогда никто из сотрудников не получит повышения.Главный родительский класс: System.Object
В заключение мы займемся исследованием главного родительского класса Object
Car, Shape, Employee) никогда явно не указывали свои родительские классы:// Какой класс является родительским для Car?
class Car
{...}
В мире .NET Core каждый тип в конечном итоге является производным от базового класса по имени System.Object
object (с буквой о в нижнем регистре). Класс Object определяет набор общих членов для каждого типа внутри платформы. По сути, когда вы строите класс, в котором явно не указан родительский класс, компилятор автоматически делает его производным от Object. Если вы хотите прояснить свои намерения, то можете определять классы, производные от Object, следующим образом (однако вы не обязаны поступать так):// Явное наследование класса от System.Object.
class Car : object
{...}
Подобно любому классу в System.Object
virtual, указывая на возможность их переопределения в подклассах, тогда как другие помечены ключевым словом static (и потому вызываются на уровне класса):public class Object
{
// Виртуальные члены.
public virtual bool Equals(object obj);
protected virtual void Finalize;
public virtual int GetHashCode;
public virtual string ToString;
// Невиртуальные члены уровня экземпляра.
public Type GetType;
protected object MemberwiseClone;
// Статические члены.
public static bool Equals(object objA, object objB);
public static bool ReferenceEquals(object objA, object objB);
}
В табл. 6.1 приведен обзор функциональности, предоставляемой некоторыми часто используемыми методами System.Object
Чтобы проиллюстрировать стандартное поведение, обеспечиваемое базовым классом Object
ObjectOverrides.Бьёрн Страуструп , Ирина Сергеевна Козлова , Бьерн Страуструп , Валерий Федорович Альмухаметов
Программирование, программы, базы данных / Базы данных / Программирование / Учебная и научная литература / Образование и наука / Книги по IT