Язык программирования C#9 и платформа .NET5
Часть 147 из 642 Информация о книге
{case SalesPerson s: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;}Console.WriteLine();}Когда к оператору
добавляется конструкцияcase, для использования доступно полное определение объекта как он приводится. Например, свойствоwhenсуществует только в классеSalesNumber, но не в классеSalesPerson. Если приведение в первом оператореEmployeeпроходит успешно, то переменнаяcaseбудет содержать экземпляр классаs, так что операторSalesPersonможно было бы переписать следующим образом:casecase SalesPerson s when s.SalesNumber > 5:Такие новые добавления к
иisобеспечивают удобные улучшения, которые помогают сократить объем кода, выполняющего сопоставление, как демонстрировалось в предшествующих примерах.switchИспользование отбрасывания вместе с операторами switch (нововведение в версии 7.0)
Отбрасывание также может применяться в операторах
:switchswitch (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. Однако, как было показано при представлении сопоставления с образцом в главе 3, после сопоставления операторtrueзавершает работу Это демонстрирует важность правильности порядка. Если финальный операторswitchпереместить в начало, тогда никто из сотрудников не получит повышения.caseГлавный родительский класс: System.Object
В заключение мы займемся исследованием главного родительского класса
. При чтении предыдущих разделов вы могли заметить, что базовые классы во всех иерархиях (Object,Car,Shape) никогда явно не указывали свои родительские классы:Employee// Какой класс является родительским для Car?class Car{...}В мире .NET Core каждый тип в конечном итоге является производным от базового класса по имени
, который в языке C# может быть представлен с помощью ключевого словаSystem.Object(с буквойobjectв нижнем регистре). Классоопределяет набор общих членов для каждого типа внутри платформы. По сути, когда вы строите класс, в котором явно не указан родительский класс, компилятор автоматически делает его производным отObject. Если вы хотите прояснить свои намерения, то можете определять классы, производные отObject, следующим образом (однако вы не обязаны поступать так):Object// Явное наследование класса от System.Object.class Car : object{...}Подобно любому классу в
определен набор членов. В показанном ниже формальном определении C# обратите внимание, что некоторые члены объявлены какSystem.Object, указывая на возможность их переопределения в подклассах, тогда как другие помечены ключевым словомvirtual(и потому вызываются на уровне класса):staticpublic class Object{<b> // Виртуальные члены.</b>public virtual bool Equals(object obj);protected virtual void Finalize();public virtual int GetHashCode();public virtual string ToString();<b> // Невиртуальные члены уровня экземпляра.</b>public Type GetType();protected object MemberwiseClone();<b> // Статические члены.</b>public static bool Equals(object objA, object objB);public static bool ReferenceEquals(object objA, object objB);}В табл. 6.1 приведен обзор функциональности, предоставляемой некоторыми часто используемыми методами
.System.Object