Зачем использовать TryCast вместо DirectCast?
Когда я пытаюсь применить Object obj к типу T, если его нельзя отбросить, то что-то не так.
И после того, как я брошу объект, я буду искать работу с литым объектом.
Скорее я буду ожидать получить исключение в том месте, где я буду его отличать, чем сказать, где я буду использовать этот объект.
В этом смысле лучше ли использовать DirectCast
вместо TryCast
?
Или мне не хватает какого-либо другого значения использования TryCast?
Ответы
Ответ 1
(Для разработчиков С# TryCast
похож на "как", а DirectCast
является эквивалентом обычного каста. Как отметил Майк в комментариях, "как" работает для типов значений с нулевым значением, но TryCast
doesn "т.)
Если значение действительно должно быть Т, то DirectCast действительно правильный путь - он не работает быстро, с соответствующей ошибкой.
TryCast
подходит, когда он легитимирует цель как "неправильный" тип. Например, чтобы получить все элементы управления Button в контейнере, вы можете пройти через коллекцию управления и попытаться отбросить каждую кнопку в Button. Если он работает, вы что-то делаете с ним - если это не так, вы двигаетесь дальше. (С LINQ вы можете просто использовать OfType
для этой цели, но вы понимаете, что я имею в виду...)
По моему опыту, непосредственное кастинг подходит чаще, чем TryCast
- хотя с помощью дженериков я нахожу себя гораздо чаще, чем обычно.
Ответ 2
Единственное различие между ними состоит в том, что TryCast вернет null, если это не удастся, в то время как DirectCast выдаст исключение.
Это влияет на то, как вы можете обрабатывать свою программу. Лично я предпочитаю не бросать исключение, если возможность неправильного литья (например, текстовые поля ввода для ввода пользователя в числовые типы) довольно высока.
Ответ 3
Я думаю, что другие упоминали времена, когда вы должны и не должны выполнять "безопасное кастинг" (где вы гарантируете, что бросок может преуспеть, прежде чем рискнуть исключением). Если ваша программа действительно нуждается в безопасном литье, то метод 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 и проверяя, не вызван ли результат, ничего не устраняет 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
Следуя этому шаблону, вы можете избежать обработки дорогостоящих исключений и эффективно использовать правильный тип.
Ответ 4
Если ваш проект требует, чтобы объект, переданный вам ДОЛЖЕН, имел тип T, тогда утвердите (как в Debug.Assert), что листинг успешно выполняет отладочные сборки и запускает исчерпывающие модульные тесты, чтобы доказать, что ваша реализация следует за вашим дизайном.
С проверенным и проверенным дизайном вы можете перенести непосредственный дар, зная, что он никогда не может потерпеть неудачу.