Pergunta

Tenho lido muitos posts/artigos sobre o uso de Iif().Tudo isso começou quando tentei usar IIf() como um operador condicional, como C/C#/C++ etc.

O que tentei fazer exatamente foi exatamente nas linhas deste post a seguir:

Usando VB.NET IIF recebo NullReferenceException

No entanto, a solução que implementei foi emprestada do seguinte site MSDN:

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

Só depois disso aprendi sobre o método If() em vb.net.

Então no final eu escrevi uma função que retorna o valor apropriado (que usou reflexão) para atingir o propósito.Mas esse método (que escrevi) não gerou nenhuma exceção.Na verdade, consegui verificar a nulidade do tipo dentro da função.

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

Minha pergunta é: há algo escrito dentro de Iif() para gerar um erro como esse?- uma NullReferenceException

If MyType Is Nothing Then Throw New NullReferenceException()

Ou há algo muito maior em ação aqui?Então, suponha que se eu quisesse escrever uma função como iif, que gerará um erro se algo na lista de argumentos for nulo, a maneira acima é a única maneira de fazer isso?

Foi útil?

Solução

A distinção é que ?: e If() são operadores. IIf() não é um operador;é uma função simples e antiga.Você pode até implementá-lo sozinho:

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

Isso significa que todos os argumentos passados ​​para a função devem ser avaliados antes a função é chamada, assim como qualquer outra função.Não há nada dentro de IIF() que gere uma exceção — é apenas o processo normal de avaliação de argumentos passados ​​para uma função.

Você também precisa observar que é perfeitamente correto passar null/Nothing para uma função.Você viu a exceção em seu código porque a expressão que você estava passando tinha uma referência nula que não pôde ser avaliada — digamos, se você fizesse algo como tentar usar a propriedade .Length de uma variável de string nula.

O operador If(), por outro lado, não tem esse problema porque é apenas isso:um operador Além disso, é um operador que aproveita a avaliação de curto-circuito, de modo que apenas a expressão retornada precisa ser avaliada.If() também tem a boa vantagem de ser seguro para o tipo, embora você também possa replicar a segurança para o tipo em uma função IIF(Of T)() genérica, se desejar.

Outras dicas

IIF difere de C++ :?de pelo menos uma forma significativa, ele sempre avalia ambas as expressões, então você não pode fazer coisas como IIF(X is nothing,DefaultValue,X.Value).Ele lançará uma exceção de referência nula porque, no caso de X não ser nada, ainda avaliará X.Value.

IIF funciona dessa maneira porque é uma função, não um operador

Você não forneceu o código de como estava usando o IIF, então estou apenas supondo.O que acabei de dizer é o primeiro comentário do link que você forneceu ao MSDN, então é provável que você já soubesse disso ou esta não seja sua pergunta.

Se a sua dúvida é realmente que você deseja lançar uma exceção, você deve usar o código que possui acima, mas lançar e ArgumentNullException em vez disso, você pode especificar qual argumento era nulo.

Você pode adicionar um argumento ByRef extra para indicar se realmente houve uma exceção na função.Desta forma podemos eliminar a necessidade de capturar qualquer exceção levantada na função.Claro, você deve adicionar a instrução Try...Catch nessa função.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top