vb.net: как iIF дает исключение нулевой ссылки? - PullRequest
2 голосов
/ 28 марта 2011

Рассматривал много постов / статей об использовании Iif ().Все это началось, когда я попытался использовать IIf () как условный оператор, очень похожий на C / C # / C ++ и т. Д.

То, что я пытался сделать в точности, было в точности следующим образомpost:

Используя VB.NET IIF, я получаю NullReferenceException

Однако реализованное мною решение было заимствовано со следующего сайта msdn:

http://msdn.microsoft.com/en-us/library/27ydhh0d%28v=vs.80%29.aspx

Только после этого я узнал о методе If () в vb.net.

Итак, в конце я написал функцию, которая возвращает соответствующее значение (которое использовало отражение)достичь цели.Но этот метод (который я написал) не стал исключением.На самом деле я смог проверить обнуляемость типа внутри функции.

Function ReturnValue(ByVal MyType As SomeType, ByVal PropertyName as String) As Object
    If MyType Is Nothing Then Return String.Empty
    Dim arrPropInfo As PropertyInfo() = MyType.GetType().GetProperties()
    Return arrPropInfo.Where(Function(x) x.Name = PropertyName).Item(0).GetValue(MyType, Nothing)
End Function

Мой вопрос: есть ли что-то написанное внутри Iif () для выдачи такой ошибки?- исключение NullReferenceException

If MyType Is Nothing Then Throw New NullReferenceException()

Или здесь есть что-то намного большее?Итак, предположим, что если бы я хотел написать функцию, подобную iif, которая выдаст ошибку, если что-то в списке аргументов будет нулевым, это единственный способ сделать это вышеуказанным способом?

Ответы [ 3 ]

8 голосов
/ 28 марта 2011

Различие состоит в том, что ?: и If() являются операторами . IIf() не является оператором; это простая старая функция. Вы даже можете реализовать это самостоятельно:

Public Shared Function IIf(ByVal Expression As Boolean, ByVal TruePart As Object, ByVal FalsePart As Object) As Object
    If Expression Then Return TruePart Else Return FalsePart
End Function

Это означает, что все аргументы, переданные функции, должны быть оценены до вызова функции, как и любая другая функция. Внутри IIF () нет ничего, что вызывало бы исключение & mdash; это просто нормальный процесс оценки аргументов, передаваемых в функцию.

Вы также должны заметить, что вполне нормально передавать null / Nothing в функцию. Вы видели исключение в своем коде, поскольку передаваемое вами выражение содержало нулевую ссылку, которую нельзя было оценить & mdash; скажем, если вы сделали что-то подобное, попробуйте использовать свойство .Length переменной NULL.

Оператор If (), с другой стороны, не имеет этой проблемы, потому что это просто: оператор Более того, это оператор, который использует преимущества оценки короткого замыкания, так что нужно только возвращаемое выражение оценены. If () также имеет приятное преимущество, заключающееся в том, что он безопасен для типов, хотя при желании вы можете повторить безопасность типов и в общей функции IIF (Of T) ().

0 голосов
/ 28 марта 2011

Вы можете добавить дополнительный аргумент ByRef, чтобы указать, действительно ли в функции произошло исключение. Таким образом, мы можем устранить необходимость отлавливать любые исключения, возникающие в функции. Конечно, вы должны добавить оператор Try ... Catch в эту функцию.

0 голосов
/ 28 марта 2011

IIF отличается от C ++: по крайней мере, одним значительным образом, он всегда оценивает оба выражения, поэтому вы не можете делать такие вещи, как IIF(X is nothing,DefaultValue,X.Value). Он выдаст исключение нулевой ссылки, потому что в случае, если X - ничто, он все равно будет оценивать X.Value.

IIF работает так, как работает, потому что это функция, а не оператор

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

Если ваш вопрос действительно заключается в том, что вы хотите выдать исключение, вам следует использовать код, который вы указали выше, но вместо этого выведите ArgumentNullException , чтобы вы могли указать, какой аргумент был нулевым.

...