Подтвердить что ты не робот

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

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

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

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

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

4b9b3361

Ответ 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), что листинг успешно выполняет отладочные сборки и запускает исчерпывающие модульные тесты, чтобы доказать, что ваша реализация следует за вашим дизайном.

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