Читать книги » Книги » Компьютеры и Интернет » Программирование » Язык программирования C#9 и платформа .NET5 - Эндрю Троелсен

Язык программирования C#9 и платформа .NET5 - Эндрю Троелсен

Читать книгу Язык программирования C#9 и платформа .NET5 - Эндрю Троелсен, Эндрю Троелсен . Жанр: Программирование.
Язык программирования C#9 и платформа .NET5 - Эндрю Троелсен
Название: Язык программирования C#9 и платформа .NET5
Дата добавления: 26 август 2023
Количество просмотров: 561
(18+) Внимание! Книга может содержать контент только для совершеннолетних. Для несовершеннолетних просмотр данного контента СТРОГО ЗАПРЕЩЕН! Если в книге присутствует наличие пропаганды ЛГБТ и другого, запрещенного контента - просьба написать на почту для удаления материала.
Читать онлайн

Язык программирования C#9 и платформа .NET5 читать книгу онлайн

Язык программирования C#9 и платформа .NET5 - читать онлайн , автор Эндрю Троелсен

В 10-м издании книги описаны новейшие возможности языка C# 9 и .NET 5 вместе с подробным "закулисным" обсуждением, призванным расширить навыки критического мышления разработчиков, когда речь идет об их ремесле.
Книга охватывает ASP.NET Core, Entity Framework Core и многое другое наряду с последними обновлениями унифицированной платформы .NET, начиная с улучшений показателей производительности настольных приложений Windows в .NET 5 и обновления инструментария XAML и заканчивая расширенным рассмотрением файлов данных и способов обработки данных.
Все примеры кода были переписаны с учетом возможностей последнего выпуска C# 9.

1 ... 94 95 96 97 98 ... 407 ВПЕРЕД
Перейти на страницу:
class="code">{

  Console.WriteLine("Unable to promote {0}. Wrong employee type", emp.Name);

  Console.WriteLine();

}

Использование отбрасывания вместе с ключевым словом is (нововведение в версии 7.0)

Ключевое слово is также разрешено применять в сочетании с заполнителем для отбрасывания переменных. Вот как можно обеспечить перехват объектов всех типов в операторе if или switch:

if (obj is var _)

{

  // Делать что-то

}

Такое условие будет давать совпадение с чем угодно, а потому следует уделять внимание порядку, в котором используется блок сравнения с отбрасыванием. Ниже показан обновленный метод GivePromotion():

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();

}

else if (emp is var _)

{

  // Некорректный тип сотрудника

  Console.WriteLine("Unable to promote {0}. Wrong employee type", emp.Name);

  Console.WriteLine();

}

Финальный оператор if будет перехватывать любой экземпляр Employee, не являющийся Manager, SalesPerson или PtSalesPerson. Не забывайте, что вы можете приводить вниз к базовому классу, поэтому PtSalesPerson будет регистрироваться как SalesPerson.

Еще раз о сопоставлении с образцом (нововведение в версии 7.0)

В главе 3 было представлено средство сопоставления с образцом C# 7.0 наряду с его обновлениями в версии C# 9.0. Теперь, когда вы обрели прочное понимание приведения, наступило время для более удачного примера. Предыдущий пример можно модернизировать для применения оператора switch, сопоставляющего с образцом:

static void GivePromotion(Employee emp)

{

  Console.WriteLine("{0} was promoted!", emp.Name);

  switch (emp)

  {

    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, так что оператор 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, который в языке C# может быть представлен с помощью ключевого слова object (с буквой о в нижнем регистре). Класс Object определяет набор общих членов для каждого типа внутри платформы. По сути, когда вы строите класс, в котором явно не указан родительский класс, компилятор автоматически делает его производным от Object. Если вы хотите прояснить свои намерения, то можете определять классы, производные от Object, следующим образом (однако вы не обязаны поступать так):

// Явное наследование класса от System.Object.

class Car : object

{...}

Подобно любому классу в System.Object определен набор членов. В показанном ниже формальном определении C# обратите внимание, что некоторые члены объявлены как 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, создайте новый проект консольного приложения C# по имени ObjectOverrides.

Добавьте в проект новый файл класса С#, содержащий следующее пустое определение типа Person:

// Не забывайте, что класс Person расширяет Object.

class Person {}

Теперь обновите операторы верхнего уровня для взаимодействия с унаследованными членами System.Object:

Console.WriteLine("***** Fun with System.Object *****n");

Person p1 = new Person();

// Использовать унаследованные члены

1 ... 94 95 96 97 98 ... 407 ВПЕРЕД
Перейти на страницу:
Комментарии (0)