none
¿Se puede comparar objetos en una instrucción Select Case? (explico) RRS feed

  • Pregunta

  • Suponiendo que tengo un objeto Botón y quiero saber si la referencia es la misma a alguno de otros objetos Botón. Algo así más o menos:

    Dim Botón as Button = CType(sender, Button) 'Suponiendo que sender lo proporciona un evento.
    
    Select Case Botón
        Case BotónA
          'Hacer algo.
        Case BotónB
          'Hacer algo.
        Case BotónC
          'Hacer algo.
        Case else 
          'Hacer algo.
    End Select

    Tal como está lo anterior no funciona. Habría que añadir algo a: Select case Botón

    (Entiendo que hay otras formas de saber si se trata del mismo botón, por ejemplo si comparo sus propiedades Name. Pero trato de hacerlo así: Comparando los propios objetos. No sé si es esto posible, esa es la consulta).


    • Editado James2016-2 domingo, 1 de diciembre de 2019 18:24
    domingo, 1 de diciembre de 2019 18:23

Respuestas

  • Seguramente te funcionará bien si usas If anidados:

    If Boton.Equals(BotonA) Then ... Else If Boton.Equals(BotonB) Then ... Else ...

    El método Equals de forma predeterminada llama a ReferenceEquals, que compara las referencias de los objetos, y por lo tanto devuelve True si y solo si se refieren al mismo objeto en memoria.

    Por cierto, para hacer esto no necesitas al CType. Podrías aplicar el Equals directamente sobre el sender.

    • Marcado como respuesta James2016-2 domingo, 1 de diciembre de 2019 21:51
    domingo, 1 de diciembre de 2019 21:32
  • Exacto. La razón es que todos estos heredan de Object el método Equals. Por lo tanto, cuando llamamos a Equals se usa Object.Equals, y en consecuencia es válido para cualquier objeto porque todos heredan de object. Obviamente te devolverá False si comparas label1.Equals(button1), pero es una comparación válida y no arroja ningún error.
    lunes, 2 de diciembre de 2019 7:31

Todas las respuestas

  • Seguramente te funcionará bien si usas If anidados:

    If Boton.Equals(BotonA) Then ... Else If Boton.Equals(BotonB) Then ... Else ...

    El método Equals de forma predeterminada llama a ReferenceEquals, que compara las referencias de los objetos, y por lo tanto devuelve True si y solo si se refieren al mismo objeto en memoria.

    Por cierto, para hacer esto no necesitas al CType. Podrías aplicar el Equals directamente sobre el sender.

    • Marcado como respuesta James2016-2 domingo, 1 de diciembre de 2019 21:51
    domingo, 1 de diciembre de 2019 21:32
  • Gracias, ¿o sea Equals puede comparar diferentes tipos sin generar error, por ejemplo un Label y un Button?
    domingo, 1 de diciembre de 2019 21:53
  • Exacto. La razón es que todos estos heredan de Object el método Equals. Por lo tanto, cuando llamamos a Equals se usa Object.Equals, y en consecuencia es válido para cualquier objeto porque todos heredan de object. Obviamente te devolverá False si comparas label1.Equals(button1), pero es una comparación válida y no arroja ningún error.
    lunes, 2 de diciembre de 2019 7:31