Чтение онлайн

ЖАНРЫ

Язык программирования C#9 и платформа .NET5
Шрифт:

Person p2 = new Person("Homer", "Simpson", 50, "111-11-1111");

// Получить строковые версии объектов.

Console.WriteLine("p1.ToString = {0}", p1.ToString);

Console.WriteLine("p2.ToString = {0}", p2.ToString);

// Протестировать переопределенный метод Equals.

Console.WriteLine("p1 = p2?: {0}", p1.Equals(p2));

// Протестировать хеш-коды.

// По-прежнему используется хеш-значение SSN

Console.WriteLine("Same hash codes?: {0}", p1.GetHashCode == p2.GetHashCode);

Console.WriteLine;

//
Изменить значение Age объекта p2 и протестировать снова.

p2.Age = 45;

Console.WriteLine("p1.ToString = {0}", p1.ToString);

Console.WriteLine("p2.ToString = {0}", p2.ToString);

Console.WriteLine("p1 = p2?: {0}", p1.Equals(p2));

// По-прежнему используется хеш-значение SSN

Console.WriteLine("Same hash codes?: {0}", p1.GetHashCode == p2.GetHashCode);

Console.ReadLine;

Ниже показан вывод:

***** Fun with System.Object *****

p1.ToString = [First Name: Homer; Last Name: Simpson; Age: 50]

p2.ToString = [First Name: Homer; Last Name: Simpson; Age: 50]

p1 = p2?: True

Same hash codes?: True

p1.ToString = [First Name: Homer; Last Name: Simpson; Age: 50]

p2.ToString = [First Name: Homer; Last Name: Simpson; Age: 45]

p1 = p2?: False

Same hash codes?: True

Использование статических членов класса System.Object

В дополнение к только что рассмотренным членам уровня экземпляра класс

System.Object
определяет два статических члена, которые также проверяют эквивалентность на основе значений или на основе ссылок. Взгляните на следующий код:

static void StaticMembersOfObject

{

// Статические члены System.Object.

Person p3 = new Person("Sally", "Jones", 4);

Person p4 = new Person("Sally", "Jones", 4);

Console.WriteLine("P3 and P4 have same state: {0}",

object.Equals(p3, p4));

// Р3 и P4 имеют то же самое состояние

Console.WriteLine("P3 and P4 are pointing to same object: {0}",

object.ReferenceEquals(p3, p4));

// Р3 и P4 указывают на тот же самый объект

}

Здесь вы имеете возможность просто отправить два объекта (любого типа) и позволить классу

System.Object
выяснить детали автоматически. Ниже показан вывод, полученный в результате вызова метода
StaticMembersOfObject
в операторах верхнего уровня:

***** Fun with System.Object *****

P3 and P4 have the same state: True

P3 and P4 are pointing to the same object: False

Резюме

В

настоящей главе объяснялась роль и детали наследования и полиморфизма. В ней были представлены многочисленные новые ключевые слова и лексемы для поддержки каждого приема. Например, вспомните, что с помощью двоеточия указывается родительский класс для создаваемого типа. Родительские типы способны определять любое количество виртуальных и/или абстрактных членов для установления полиморфного интерфейса. Производные типы переопределяют эти члены с применением ключевого слова
override
.

Вдобавок к построению множества иерархий классов в главе также исследовалось явное приведение между базовыми и производными типами. В завершение главы рассматривались особенности главного родительского класса в библиотеках базовых классов .NET Core —

System.Object
.

Глава 7

Структурированная обработка исключений

В настоящей главе вы узнаете о том, как иметь дело с аномалиями, возникающими во время выполнения кода С#, с использованием структурированной обработки исключений. Будут описаны не только ключевые слова С#, предназначенные для этих целей (

try
,
catch
,
throw
,
finally
,
when
), но и разница между исключениями уровня приложения и уровня системы, а также роль базового класса
System.Exception
. Кроме того, будет показано, как создавать специальные исключения, и рассмотрены некоторые инструменты отладки в Visual Studio, связанные с исключениями.

Ода ошибкам, дефектам и исключениям

Что бы ни нашептывало наше (порой завышенное) самомнение, идеальных программистов не существует. Разработка программного обеспечения является сложным делом, и из-за такой сложности довольно часто даже самые лучшие программы поставляются с разнообразными проблемами. В одних случаях проблема возникает из-за "плохо написанного" кода (например, по причине выхода за границы массива), а в других — из-за ввода пользователем некорректных данных, которые не были учтены в кодовой базе приложения (скажем, когда в поле для телефонного номера вводится значение вроде

Chucky
). Вне зависимости от причин проблемы в конечном итоге приложение не работает ожидаемым образом. Чтобы подготовить почву для предстоящего обсуждения структурированной обработки исключений, рассмотрим три распространенных термина, которые применяются для описания аномалий.

• Дефекты. Выражаясь просто, это ошибки, которые допустил программист. В качестве примера предположим, что вы программируете на неуправляемом C++. Если вы забудете освободить динамически выделенную память, что приводит к утечке памяти, тогда получите дефект.

• Пользовательские ошибки. С другой стороны, пользовательские ошибки обычно возникают из-за тех, кто запускает приложение, а не тех, кто его создает. Например, ввод конечным пользователем в текстовом поле неправильно сформированной строки с высокой вероятностью может привести к генерации ошибки, если в коде не была предусмотрена обработка некорректного ввода.

• Исключения. Исключениями обычно считаются аномалии во время выполнения, которые трудно (а то и невозможно) учесть на стадии программирования приложения. Примерами исключений могут быть попытка подключения к базе данных, которая больше не существует, открытие запорченного XML-файла или попытка установления связи с машиной, которая в текущий момент находится в автономном режиме. В каждом из упомянутых случаев программист (или конечный пользователь) обладает довольно низким контролем над такими "исключительными" обстоятельствами.

Поделиться с друзьями: