C#: AS и IS

Сегодня я решил рассказать о не всем известных конструкциях языка 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. Все зависит от задачи и вашего решения.

Запись опубликована в рубрике C# с метками , , , , , , , , . Добавьте в закладки постоянную ссылку.