Nextrp [CPP] RU + Many GEOs Игра на карте России | NEXTRP

Зачем использовать TryCast вместо DirectCast?

vb.net casting

31650 просмотра

4 ответа

5069 Репутация автора

Когда я пытаюсь привести Object objк типу T, если он не может быть приведен, значит что-то не так.

И после того, как я приведу объект, я буду искать работу с объектом.

Скорее я ожидаю получить исключение в месте, где я буду его кастовать, чем сказать, где я буду использовать этот объект.

В этом смысле лучше использовать DirectCastвместо TryCast? Или я упускаю какое-то другое значение использования TryCast?

Автор: Biswanath Источник Размещён: 22.12.2008 07:21

Ответы (4)


39 плюса

1089009 Репутация автора

Решение

(Для разработчиков на C # TryCastпохоже на «как» и DirectCastявляется эквивалентом обычного приведения. Как отметил Майк в комментариях, «as» работает для типов значений, допускающих значение NULL, но TryCastне работает.)

Если значение действительно должно быть a T, то DirectCastэто действительно правильный путь - он быстро завершается с соответствующей ошибкой.

TryCastуместно, когда целью является «неправильный» тип цели. Например, чтобы получить все элементы управления Button в контейнере, вы можете просмотреть коллекцию элементов управления и попытаться привести каждый из них к Button. Если это работает, вы делаете что-то с этим - если это не так, вы идете дальше. (С LINQ вы можете просто использовать OfTypeдля этой цели, но вы понимаете, что я имею в виду ...)

По моему опыту, прямое приведение к уместности чаще, чем ... TryCastхотя с дженериками я нахожу себя приведением намного реже, чем когда-либо раньше.

Автор: Jon Skeet Размещён: 22.12.2008 07:32

15 плюса

79191 Репутация автора

Единственное различие между ними состоит в том, что a TryCastвернет ноль в случае сбоя, а a DirectCastсгенерирует исключение.

Это влияет на то, как вы можете справиться с вашей программой. Лично я предпочитаю не создавать исключение, если вероятность неправильного приведения (например, поля ввода текста для пользовательского ввода преобразуются в числовые типы) довольно высока.

Автор: Jon Limjap Размещён: 22.12.2008 07:33

1 плюс

5336 Репутация автора

Если ваш проект требует, чтобы передаваемый вам объект ДОЛЖЕН иметь тип T, то утверждайте (как в Debug.Assert), что приведение успешно в отладочных сборках и запускает исчерпывающие модульные тесты, чтобы доказать, что ваша реализация соответствует вашему дизайну.

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

Автор: Daniel Paull Размещён: 22.12.2008 08:13

9 плюса

31637 Репутация автора

Я думаю, что другие упомянули времена, когда вы должны и не должны выполнять «безопасное приведение» (когда вы гарантируете, что приведение может быть успешным, прежде чем рискнуть исключением). Если вашей программе нужно выполнить безопасное приведение, тогда этот TryCastметод спасет вас и программу некоторой работой.

TryCast()До сегодняшнего дня я не знал об этой функции, и я чувствую себя дураком, если использую «плохой» метод безопасного литья.

Если вы не знаете о TryCast()функции, вы можете получить что-то вроде этого:

'' wasteful, the TypeOf and DirectCast calls are redundant
If TypeOf obj Is SomeClass Then
    someObj = DirectCast(obj, SomeClass)
    '' More code
End If

Проблема в том, что этот метод на самом деле выполняет два приведения (технически я думаю, что это на самом деле проверки типов). Использование TryCastи проверка, если результат равен Nothing, устраняет 2-й актерский состав и сохраняет ненужную работу.

'' efficient, only one cast is ever performed and there are no InvalidCastExceptions thrown
someObj = TryCast(obj, SomeClass)
If someObj IsNot Nothing Then
    '' More code
End If

Следование этому шаблону позволяет избежать необходимости обрабатывать дорогостоящие исключения и эффективно приводить к правильному типу.

Автор: STW Размещён: 30.01.2009 09:37
Вопросы из категории :
32x32