Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > .NET Frameworks (точка нет фреймворки) > Общие вопросы .NET
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 15.02.2015, 21:48   #1
hoz
Форумчанин
 
Аватар для hoz
 
Регистрация: 29.06.2013
Сообщений: 132
По умолчанию излишняя проверка после использования ключевого слова is

Попался такой момент:
Код:
public override bool Equals( object obj )
        {
            if (obj is Person && obj != null)
            {
                Person temp;
                temp = (Person)obj;
                if (temp.FirstName == this.FirstName
                    && temp.LastName == this.LastName
                    && temp.Age == this.Age)
                {
                    return true;
                }
                else
                {
                    return false;
                }
            }
            return false;
        }
Изначально, в начале метода имеется условие:
[codeif (obj is Person && obj != null)[/code]
где проверяется "является" ли obj Person' ом. Если условие истинно, т.е. "является" только в условии if отрабатывается дальше. Если нет происходит исключение.
Так вот. Если всё-таки тело отрабатывается дальше, то это означает, что obj "является" Person.
Возникает логичный вопрос. Зачем приводит obj к типу Person, если мы уже и так проверили, что он "является" этим типом?

Последний раз редактировалось Stilet; 11.03.2015 в 22:23.
hoz вне форума Ответить с цитированием
Старый 15.02.2015, 22:08   #2
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,792
По умолчанию

Цитата:
Зачем приводит obj к типу Person, если мы уже и так проверили, что он "является" этим типом?
А потому что is это проверка. И дальше if() никакого приведения она не делает.
Т.е. она работает и живет только в рамках условия, но не распространяется на тело самого if. Поэтому даже если компиль не заругается, кольскоро ты не напишешь (Person)obj, оставив только obj, это не есть хороший тон программирования, и в строго типизированных ЯВУ такое попустительство не проканает. Думаю шарпейчик тоже не обрадуется, если ты не укажешь тип приведения.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 16.02.2015, 20:13   #3
pu4koff
Старожил
 
Аватар для pu4koff
 
Регистрация: 22.05.2007
Сообщений: 9,520
По умолчанию

Цитата:
Сообщение от hoz Посмотреть сообщение
Изначально, в начале метода имеется условие:
PHP код:
  if (obj is Person && obj != null
obj != null в принципе не нужен, но не влияет на работоспособность кода.
Цитата:
Сообщение от hoz Посмотреть сообщение
Если условие истинно, т.е. "является" только в условии if отрабатывается дальше. Если нет происходит исключение.
Никакого исключения не происходит. Просто отрабатывает ветка else.
Цитата:
Сообщение от hoz Посмотреть сообщение
Возникает логичный вопрос. Зачем приводит obj к типу Person, если мы уже и так проверили, что он "является" этим типом?
Особенность языка. Можете использовать as:
Код:
Person temp = obj as Person;
if (temp != null)
{
  if (temp.FirstName == this.FirstName 
                    && temp.LastName == this.LastName 
                    && temp.Age == this.Age) 
                { 
                    return true; 
                } 
                else 
                { 
                    return false; 
                }
}
else
{
  return false;
}
pu4koff вне форума Ответить с цитированием
Старый 11.03.2015, 21:09   #4
New man
Форумчанин
 
Регистрация: 24.01.2011
Сообщений: 774
По умолчанию

Код:
class A { }
    class B:A { }
    class C : B { }
    class Program
    {
        static void Main(string[] args)
        {
            A a = new A();
            B b = new B();
            C c = new C();
            Console.WriteLine(a is A);
            Console.WriteLine(b is A);
            Console.WriteLine(c is A);
        }
    }
Попробуй запустить этот код.
Он выведет три раза подряд true.
Из-за необходимости обработки таких случаев и нужно приводить явно.
a.k.a. Angelicos Phosphoros
Мой сайт

Последний раз редактировалось New man; 11.03.2015 в 21:10. Причина: лишняя запятая
New man вне форума Ответить с цитированием
Старый 11.03.2015, 21:18   #5
Luuzuk
Форумчанин
 
Аватар для Luuzuk
 
Регистрация: 18.01.2012
Сообщений: 975
По умолчанию

Цитата:
Из-за необходимости обработки таких случаев и нужно приводить явно
бред. такие случаи здесь вообще не при делах
Благодарить в репутацию. Проклинать — туда же
Luuzuk вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Использование ключевого слова as Notegimcool C# (си шарп) 3 16.05.2014 12:35
частота использования слова в Memo Vashkin Компоненты Delphi 12 08.01.2012 13:15
Поиск ключевого слова по текстовым файлам в заданной директории....помогите плиз N-tony Общие вопросы C/C++ 0 07.01.2010 14:46
virtualbox: не работает сеть на компе после использования этой проги bill_gates Софт 0 05.07.2009 13:03
Кодирование на основе ключевого слова и шифрование файла Шульц Помощь студентам 5 24.09.2008 22:09