Бросок затем проверяет или проверяет затем бросок? [дубликат]

16
задан Community 23 May 2017 в 11:53
поделиться

5 ответов

Если объект может иметь или не быть того типа, который вам нужен, то как ] (ваш первый метод) лучше по двум причинам:

  • Удобство чтения и простота обслуживания: вы указываете тип только один раз
  • Производительность: вы выполняете приведение только один раз, а не дважды. (Интересный факт: когда вы используете ключевое слово is , компилятор C # внутренне переводит его в как , т.е. coke is Cola эквивалентно (coke as Cola)! = null )

Если объект всегда должен быть запрошенного типа, просто сделайте (Coke) cola и позвольте ему сгенерировать исключение, если это не так.

19
ответ дан 30 November 2019 в 17:04
поделиться

Я думаю, что это более эффективный 1-й способ: Проведите трансляцию, а затем проверьте , но ...

Много времени вы разрабатываете для разработчиков, и, на мой взгляд, это гораздо более читабельно проверка сначала, а затем приведение ...

3
ответ дан 30 November 2019 в 17:04
поделиться

Первый (преобразование сначала через as) немного более эффективен, поэтому в этом отношении ~ может быть ~ наилучшей практикой.

Однако в приведенном выше коде, как правило, присутствует некоторый «запах кода». Я бы подумал о рефакторинге любого кода, который следует этому шаблону, если это возможно. Попросите ICola предоставить метод описания и позволить ему описать себя. Это позволяет избежать проверки типов и дублирования кода ...

7
ответ дан 30 November 2019 в 17:04
поделиться

Позвольте мне просто выложить его там. Но я думаю, что ни то, ни другое не является правильным :) В вашем конкретном примере, зачем вообще иметь интерфейс? Я бы поместил метод «Describe» на ваш интерфейс ICola, а затем реализовал логику описания в ваших классах CocaCola и Pepsi, которые реализуют интерфейс.

Так что в основном поместите это // какой-то уникальный только код здесь. в реализующие классы.

Но чтобы ответить на ваш вопрос, я думаю, что проверка, а затем каст более уместна.

1
ответ дан 30 November 2019 в 17:04
поделиться

В этом примере используется безопасный локальный параметр, но во многих случаях проверка типа применяется к полям (переменным-членам) класса. В этом случае "as" -then-check безопасно, но "is" -then-cast создает беспричинное состояние гонки.

4
ответ дан 30 November 2019 в 17:04
поделиться
Другие вопросы по тегам:

Похожие вопросы: