Pregunta

Estado mirando un montón de post/artículos sobre el uso de Iif().Todo esto comenzó cuando traté de usar IIf() como un operador condicional mucho en los gustos de C/C#/C++, etc.

Lo que traté de hacer exactamente lo que estaba exactamente en las líneas de este de los siguientes post:

El uso de VB.NET IIF puedo obtener NullReferenceException

Sin embargo, la solución que se me había implementado, fue tomada desde el siguiente sitio web de msdn:

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

Su sólo después de que he aprendido sobre el Si() en el método vb.net.

Así que al final me había escrito una función que devuelve el valor apropiado (que utilizan la reflexión) para lograr el propósito.Pero ese método (que escribí) no lanzar ninguna excepción.De hecho, yo era capaz de verificación para la aceptación de valores null en el tipo dentro de la función.

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

Mi pregunta es, hay algo escrito dentro de Iif() para lanzar un error como ese?- una excepción NullReferenceException

If MyType Is Nothing Then Throw New NullReferenceException()

O es que hay algo mucho más grande en el trabajo aquí?Así que supongo que si yo quería escribir la función como iif, que producirá un error si algo en la lista de argumento es null es por encima de la forma en que la única forma de hacerlo?

¿Fue útil?

Solución

La distinción es que ?: y If() son los operadores. IIf() no es un operador;se trata de una llanura antiguo de la función.Incluso puedes aplicar a ti mismo:

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

Esto significa que todos los argumentos pasados a la función deben ser evaluados antes de se llama a la función, al igual que cualquier otra función.No hay nada dentro de IIF() que lanza una excepción — es el proceso normal de evaluación de argumentos pasados a una función.

También es necesario señalar que es perfectamente aceptable para pasar null/Nada a una función.Usted vio la excepción en el código debido a que la expresión que pasaban tenían una referencia nula de que no pudieron ser evaluados — por ejemplo, si usted hizo algo como tratar de utilizar el .Propiedad de longitud de una cadena nula variable.

El Si() operador, por otro lado, no tiene este problema porque es precisamente eso:un operador por otra parte, es un operador que toma ventaja de la evaluación de cortocircuito, de tal manera que sólo la devolución de expresión debe ser evaluado.Si() también tiene la buena ventaja de ser de tipo seguro, a pesar de que usted podría replicar tipo de seguridad en un genérico IIF(T) función de() así, si quería.

Otros consejos

IIF diferencia de C++ :?en menos de una manera significativa, siempre evalúa las expresiones de modo que usted no puede hacer cosas como IIF(X is nothing,DefaultValue,X.Value).Se lanzará una excepción de referencia nula debido a que en el caso de que X no es nada, que aún vamos a evaluar X. Valor.

IIF funciona de la manera que lo hace porque es una función, no un operador

No proporcionar el código de cómo se estaban utilizando IIF tan sólo estoy adivinando.Lo que acabo de decir es el primer comentario desde el enlace proporcionado a MSDN así que es muy probable que usted ya lo sabía, o este no es tu pregunta.

Si tu pregunta es, realmente, que desea lanzar una excepción, usted debe utilizar el código de arriba, pero el tiro y ArgumentNullException en lugar de modo que usted puede especificar que el argumento era nula.

Puede agregar un argumento adicional de Byref para indicar si, de hecho, se sucedió excepción en la función.De esta manera, podemos eliminar la necesidad de capturar cualquier excepción planteada en la función.Por supuesto, debe agregar intento ... Declaración de captura en esa función.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top