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