Tenemos una propiedad cuyo trabajo es buscar una descripción. Si la búsqueda falla se debe mostrar una cadena vacía.

Por lo que podemos código de la propiedad como esta:

If foo.bar Is Not Nothing Then
  Return foo.bar.Description
Else
  Return String.Empty
End If

Pero que implica la ejecución de foo.bar dos veces, y si, al hacerlo, es caro, es probable que sea mejor así:

Dim b As bar = foo.bar
If b IsNot Nothing Then
  Return b.Description
Else
  Return String.Empty
End If

Pero realmente todo lo que quiero hacer es tratar cualquier tipo de error, como un vacío de la descripción. En cierta forma, esto es más simple:

Try
  Return foo.bar.Description
Catch e As NullReferenceException
  Return String.Empty
End Try

Pero hay algún problema (rendimiento, pureza, otros?) con sólo la captura y omitiendo el error?

Que a veces leer es caro para lanzar una excepción pero no estoy seguro de si el autor se refiere a que es caro para construir excepciones en el uso de la Throw palabra clave (que yo no estoy haciendo) o si el medio es caro para permitir excepciones a ocurrir (como me gustaría estar haciendo).

OriginalEl autor hawbsl | 2010-11-12

3 Comentarios

  1. 8

    Si definitivamente prueba para Nothing en lugar de depender de las excepciones aquí. El código indica que el escenario donde foo.bar es Nothing es un escenario esperado, y no un excepcional uno. Que tipo de da la respuesta.

    Lanzar una excepción es una operación relativamente costosa (desde una perspectiva de rendimiento). Este es el caso independientemente de si usted está tirando en el código, o si se produce en la biblioteca de código; es exactamente la misma operación. Sin embargo, no sería mantener de lanzar excepciones por motivos de rendimiento a menos que yo tenía un real, medido, crítico del caso de negocio.

    En mi opinión, esto es principalmente una cuestión de mostrar la intención; por prueba para Nothing y actuar correctamente en la que, el código expresa el hecho de que esto no es una cosa extraña a suceder.

    Si usted está preocupado por el rendimiento en la ejecución de foo.bar dos veces, la primera cosa a hacer es averiguar si ese es realmente el caso. Si es así, probablemente hay maneras de solucionar eso (el ejemplo de código ya contiene una sugerencia).

    +1 Un excelente, bien explicado respuesta. Y el 100% correcto.

    OriginalEl autor Fredrik Mörk

  2. 2

    Usted siempre debe tratar de pruebas para nada cuando lo están esperando como una condición controlada, sólo el uso de capturas donde sea posible manejar no deseados errores (yo uso no deseado de manera general como algunos errores de producir los resultados deseados). La habilidad para manejar cadenas nulas sin coger una excepción hay manera de usarlo.

    Utilizar una cadena vacía función de prueba dentro de la clase String tipo llamado IsNullOrEmpty o IsNullOrWhiteSpace:

        Public Shared Sub Main()
    
            Dim f As String
            Dim b As String
    
            Dim emptyResponseString As String = "I was empty"
    
            'Foo will return a Null String'
    
            f = foo()
    
            'Bar will return an instantiated String'
    
            b = bar()
    
            If String.IsNullOrEmpty(f) Then
                Console.Out.WriteLine("foo(): " & emptyResponseString)
            Else
                Console.Out.WriteLine("foo(): " & f)
            End If
    
            If String.IsNullOrEmpty(b) Then
                Console.Out.WriteLine("bar(): " & emptyResponseString)
            Else
                Console.Out.WriteLine("bar(): " & b)
            End If
    
        End Sub
    
        Public Shared Function foo() As String
            Return Nothing
        End Function
    
        Public Shared Function bar() As String
            Return "I am not empty!"
        End Function

    Esto le permitirá salir de su manejo de excepciones para excepciones inesperadas (como debe ser ^^ )

    En la perspectiva de sus opciones, la segunda es la más cercana a lo que yo recomendaría, poner sus funciones el resultado en la celebración de una variable, entonces prueba esta variable mediante String.IsNullOrEmpty o si desea incluir espacios en blanco de comprobación, a continuación, String.IsNullOrWhiteSpace (esto también pruebas para las cadenas vacías demasiado).

    Aquí está el código que se ejecuta:

    http://ideone.com/CelDe

    OriginalEl autor Tom ‘Blue’ Piddock

  3. 2

    Me gustaría ir con este enfoque:

    Dim b As bar = foo.bar
    If b IsNot Nothing Then
      Return b.Description
    Else
      Return String.Empty
    End If

    Si después de encontrar a ti mismo repitiendo la misma porción de código a menudo, usted puede envolver esta búsqueda en una función genérica, como este:

    Private Function GetPropertyOrStringEmptyIfNothing(barObj As bar, propSelector As Func(Of bar, String))
      If barObj IsNot Nothing Then
        Return propSelector(barObj)
      Else
        Return String.Empty
      End If
    End Function

    Aquí es un ejemplo de uso:

    GetPropertyOrStringEmptyIfNothing(foo.bar, Function(x) x.Description)

    Que va a trabajar, suponiendo que se tiene una clase similar, declaró en el ámbito actual:

    Class bar
      Public Description As String
    End Class

    Tan lejos como el costo de la captura de excepciones, aquí hay un enlace a mi respuesta en otra pregunta. Te da una idea de cómo se captura la excepción de los impactos de la depuración de rendimiento y el de su versión de Lanzamiento. Semánticamente, es mejor evitar lanzar excepciones si no la situación excepcional, como ya se ha mencionado en otras respuestas.

    OriginalEl autor Neolisk

Dejar respuesta

Please enter your comment!
Please enter your name here