Преобразование типов

Последнее обновление: 18.07.2018
Вопрос 1

Что будет выведено на консоль в результате выполнения следующей программы и почему?:

using System;

namespace HelloApp
{
    class Program
    {
        static void Main(string[] args)
        {
            Person tom = new Person { Name = "Tom" };
            Employee empl = tom as Employee;
            tom.Name = "Bob";
            Console.WriteLine(empl.Name);
            Console.ReadKey();
        }
    }

    class Person
    {
        public string Name { get; set; }
    }
    class Employee : Person { }
}

При выполнении программа сгенерирует исключение System.NullReferenceException, потому что поскольку переменная tom НЕ представляет объект Employee, то преобразование tom as Employee возвратит null.

Вопрос 2

Что будет выведено на консоль в результате выполнения следующей программы и почему?:

using System;

namespace HelloApp
{
    class Program
    {
        static void Main(string[] args)
        {
            Person tom = new Employee { Name = "Tom" };
            Person bob = tom;
            Employee empl = bob as Employee;
            tom.Name = "Bob";
            Console.WriteLine(empl.Name);
            Console.ReadKey();
        }
    }

    class Person
    {
        public string Name { get; set; }
    }
    class Employee : Person { }
}

На консоль будет выведена строка "Bob". Переменная tom хранит ссылку на объект Employee. Переменная bob после присвоения также хранит эту же ссылку на объект Employee. Поэтому преобразование bob as Employee возвратит объект Employee, которая будет присвоена переменной empl. Поскольку все три переменных tom, bob, empl хранят ссылку на один и тот же объект в памяти, то после изменения объекта через одну из этих переменных приведет к тому, что другие переменные будут указывать на этот измененный объект.

Вопрос 3

Есть два класса:

class Person
{
	public string Name { get; set; }
}
class Employee : Person { }

Для преобразования объекта Person к типу Employee мы можем использовать следующие два способа:

Person tom = new Person { Name = "Tom" };
Employee empl1 = tom as Employee;
Employee empl2 = (Employee)tom;

Какой из способов является более предпочтительным и почему?

Использование оператора as является более предпочтительным, поскольку в случае неудачного преобразования этот оператор возвращает значение null. При доступе к объекту через переменную мы можем проверить ее значение на null.

А операция преобразования (тип) в случае неудачного преобразования генерирует исключение. Мы можем отлавливать данное исключение через конструкцию try...catch. Однако, как правило, обработка исключений является более затратной операций по сравнению с простой проверкой в блоке if.

Дополнительные материалы
Помощь сайту
Юмани:
410011174743222
Перевод на карту
Номер карты:
4048415020898850