Question

J'ai regardé beaucoup de post / articles sur l'utilisation de iif (). Tout cela a commencé lorsque j'ai essayé d'utiliser IIF () comme un opérateur conditionnel beaucoup comme C / C # / C ++ etc.

Ce que j'ai essayé de faire exactement était exactement dans les lignes de celui-ci du post suivant:

En utilisant vb.net iif je reçois nullReferenceException

Cependant, la solution que j'avais mise en œuvre a été empruntée au site MSDN suivant:

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

Ce n'est qu'après que j'ai appris la méthode if () dans vb.net.

Ainsi, à la fin, j'avais écrit une fonction qui renvoie la valeur appropriée (qui a utilisé la réflexion) pour atteindre le but. Mais cette méthode (que j'ai écrite) n'a fait aucune exception. En fait, j'ai pu vérifier la nullabilité du type à l'intérieur de la fonction.

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

Ma question est, y a-t-il quelque chose d'écrit à l'intérieur iif () pour lancer une erreur comme ça? - une nullReferenceException

If MyType Is Nothing Then Throw New NullReferenceException()

Ou y a-t-il quelque chose de beaucoup plus grand au travail ici? Supposons donc que si je voulais écrire de la fonction comme iif, qui lancera une erreur si quelque chose dans la liste d'arguments est nul est la manière ci-dessus la seule façon de le faire?

Était-ce utile?

La solution

La distinction est que ?: et If() sommes les opérateurs. IIf() n'est pas un opérateur; c'est une vieille fonction. Vous pouvez même le mettre en œuvre vous-même:

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

Cela signifie que tous les arguments transmis à la fonction doivent être évalués avant de La fonction est appelée, comme toute autre fonction. Il n'y a rien à l'intérieur iif () qui lance une exception - c'est juste le processus normal d'évaluation des arguments transmis à une fonction.

Vous devez également noter qu'il est parfaitement acceptable de passer null / rien à une fonction. Vous avez vu l'exception de votre code parce que l'expression que vous passiez avait une référence nul qui ne pouvait pas être évaluée - disons, si vous avez fait quelque chose comme essayer d'utiliser la propriété .Length d'une variable de chaîne nulle.

L'opérateur if (), en revanche, n'a pas ce problème car c'est juste cela: un opérateur en outre, c'est un opérateur qui tire parti de l'évaluation de court-circuit, de sorte que seule l'expression retournée doit être évaluée. Si () a également le bel avantage d'être en sécurité, bien que vous puissiez reproduire également la sécurité de type dans une fonction générique iif (de t) (), si vous le vouliez.

Autres conseils

Iif diffère de C ++ :? D'au moins une manière significative, il évalue toujours les deux expressions afin que vous ne puissiez pas faire des choses comme IIF(X is nothing,DefaultValue,X.Value). Il lancera une exception de référence nul car dans le cas où x n'est rien, il évaluera toujours x.value.

Iif fonctionne comme c'est le cas parce que c'est une fonction, pas un opérateur

Vous n'avez pas fourni de code pour la façon dont vous utilisiez IIF, donc je devine. Ce que je viens de dire, c'est le tout premier commentaire du lien que vous avez fourni à MSDN, il est donc probable que vous le saviez déjà ou ce n'est pas votre question.

Si votre question est vraiment que vous souhaitez lancer une exception, vous devez utiliser le code que vous avez ci-dessus, mais lancer et ArgumentNullexception Au lieu de cela, vous pouvez spécifier quel argument était nul.

Vous pouvez ajouter un argument ByRef supplémentaire pour indiquer si, en effet, une exception s'est produite dans la fonction. De cette façon, nous pouvons éliminer la nécessité de prendre toute exception soulevée dans la fonction. Bien sûr, vous devez ajouter une instruction Try ... Catch dans cette fonction.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top