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

Неустранимая ошибка: не может использовать возвращаемое значение функции в контексте записи

Это обычно происходит при непосредственном использовании функции с empty.

Пример:

if (empty(is_null(null))) {
  echo 'empty';
}

Это связано с тем, что empty - это языковая конструкция, а не функция, она не может быть вызвана с выражением в качестве аргумента в версиях PHP до 5.5. До PHP 5.5 аргумент empty() должен быть переменной , но произвольное выражение (такое как возвращаемое значение функции) допустимо в PHP 5.5 +.

empty, несмотря на его имя, на самом деле не проверяет, является ли переменная «пустой». Вместо этого он проверяет, существует ли переменная, или == false. Выражения (например, is_null(null) в примере) всегда будут считаться существующими, поэтому здесь empty проверяет только, равен ли он false. Здесь вы можете заменить empty() на !, например. if (!is_null(null)), или явно сравнить с ложным, например. if (is_null(null) == false).

Вопросы, относящиеся

26
задан Neuron 27 February 2019 в 15:22
поделиться

4 ответа

(Для разработчиков C#, TryCast подобно тому, "поскольку" и DirectCast эквивалент нормального кастинга. Как Mike указал в комментариях, "поскольку" работы для nullable типов значения, но TryCast не делает.)

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

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

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

39
ответ дан Neuron 28 November 2019 в 06:36
поделиться

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

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

15
ответ дан Neuron 28 November 2019 в 06:36
поделиться

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

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

9
ответ дан Neuron 28 November 2019 в 06:36
поделиться

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

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

1
ответ дан Daniel Paull 28 November 2019 в 06:36
поделиться
Другие вопросы по тегам:

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