Сегодня я решил рассказать о не всем известных конструкциях языка C# как AS и IS…
Скажу честно, я сам долго не знал о таких ключевых словах. Однако после того, как столкнулся с ними, понял, что до этого моя жизнь была наполнена лишними телодвижениями… собственно как и сейчас =) Так зачем же нужны такие конструкции языка как as и is?
Создавая программы на языке C# постоянно приходиться сталкиваться с преобразованием типов. И, наверное, каждый сталкивался с выбросом исключений, связанных с тем, что было невозможно перевести один объект к другому. Например:
public partial class Form1 : Form { public Form1() { InitializeComponent(); TextBox tb = new TextBox(); Label l = new Label(); Random r = new Random(); tb.Name = "TextBox"; l.Name = "Label"; object obj = null; if (r.Next() % 2 == 0) { obj = (object)tb; } else { obj = (object)l; } this.SayName(obj); } private void SayName(object obj) { MessageBox.Show(((TextBox)obj).Name); } }
Теперь запуская наше приложение мы либо будем видеть сообщение с надписью «TextBox», либо наша программа будет падать с исключением ‘Не удалось привести тип объекта «System.Windows.Forms.Label» к типу «System.Windows.Forms.TextBox»‘. (в зависимости от четности случайного числа).
Далее будем работать только с функцией SayName.
Чтобы избежать исключительной ситуации мы можем воспользоваться блоком try — catch, но как известно они замедляют работу программы, да и не о них мы говорим. Мы можем избежать исключительной ситуации двумя способами.
Способ 1: IS
Ключевое слово IS позволяет сравнить объект и тип данных, что бы определить принадлежит ли наш объект этому типу. Возвращает данная конструкция либо true либо false. Например:
private void SayName(object obj) { if (obj is TextBox) { MessageBox.Show(((TextBox)obj).Name); } }
Забавно, не правда ли? Но это еще не все. Рассмотрим способ два.
Способ 1: AS
Ключевое слово AS служит для перевода объекта к указанному типу, но в отличие от знакомой конструкции используемой в примере выше [(тип)объект], в случае невозможности привести объект к указанному типу мы вместо исключения получим null. Например:
private void SayName(object obj) { if (obj as TextBox != null) { MessageBox.Show(((TextBox)obj).Name); } }
В данному случае мы по сути два раза выполняем операцию приведения типа, что тоже не хорошо. Немного подредактируем код:
private void SayName(object obj) { TextBox tmp = obj as TextBox; if (tmp != null) { MessageBox.Show(tmp.Name); } }
Вот так гораздо лучше.
На этом собственно и все. Как пользоваться данными конструкциями вы теперь знаете. В одних случаях удобней пользоваться словом as в в других is. Все зависит от задачи и вашего решения.