Что будет выведено на консоль в результате выполнения следующей программы и почему?:
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.
Что будет выведено на консоль в результате выполнения следующей программы и почему?:
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 хранят ссылку на один и тот же объект в памяти, то после изменения объекта через одну
из этих переменных приведет к тому, что другие переменные будут указывать на этот измененный объект.
Есть два класса:
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.