none
Consulta básica sobre propiedades de una clase

    Pregunta

  • Cuanto más empiezo a conocer VB Net tanto más dudas surgen.

    Veo que las propiedades pueden ser tan simples como se declara una variable y tan complejas como lo puede ser una función (corríjanme si estoy errado).


    Respecto a lo anterior, ahora la consulta es la siguiente:


    En este caso particular:


      Public Shared ReadOnly Property MiPropiedad() As Boolean
        Get
          Return MiVariable 'Digamos que MiVariable es una variable booleana cualquiera
        End Get
      End Property


    Esta línea de abajo no es equivalente noo?

      Public Shared ReadOnly Property MiPropiedad As Boolean = MiVariable

    ¿Cuál es exactamente la diferencia?


    domingo, 6 de noviembre de 2016 21:15

Respuestas

  • La primera modalidad devuelve siempre el valor de MiVariable en todo momento. La segunda se inicializa con MiVariable, pero si con posterioridad MiVariable cambia de valor, MiPropiedad sigue devolviendo el valor que cargó al principio.
    • Marcado como respuesta James-2016 domingo, 6 de noviembre de 2016 23:00
    domingo, 6 de noviembre de 2016 21:47
  • "James-2016" escribió:

    > En este caso particular:
    >
    >  Public Shared ReadOnly Property MiPropiedad() As Boolean
    >     Get
    >       Return MiVariable 'Digamos que MiVariable es una variable booleana cualquiera
    >     End Get
    >  End Property
    >
    > Esta línea de abajo no es equivalente noo?
    >
    >
    >  Public Shared ReadOnly Property MiPropiedad As Boolean = MiVariable
    >
    >
    > ¿Cuál es exactamente la diferencia?

    Ampliando la respuesta de Alberto, el motivo de que en el segundo supuesto la propiedad MiPropiedad SIEMPRE devuelva el valor que se le asigno (MiVariable), es porque tu estás haciendo uso de una propiedad implementada automáticamente, por lo que a la hora de compilar tu proyecto, el compilador de Visual Basic creará un campo privado (y compartido en éste caso), que será el valor que devuelva la propiedad MiPropiedad.

    Para que te hagas una idea. Si tu escribes:

        Public Shared ReadOnly Property MiPropiedad As Boolean = MiVariable

    El compilador generará automáticamente el siguiente código:

        ' Un campo privado y compartido de respaldo cuyo nombre será igual
        ' que el de la propiedad pero comienza con un guión bajo.
        '
        Private Shared _MiPropiedad As Boolean
    
        ' La estructura de la propiedad como siempre se ha escrito.
        '
        Public Shared ReadOnly Property MiPropiedad As Boolean
            Get
                ' Devuelve el valor del campo creado.
                Return Form1._MiPropiedad
            End Get
        End Property

    De ahí que la propiedad llamada MiPropiedad siempre devolverá el valor del campo creado de respaldo por el compilador (_MiPropiedad).

    Y en el constructor compartido de la clase donde hayas declarado la propiedad, el compilador incluirá el siguiente código:

        Shared Sub New()
    
             ' Asignar al campo "oculto" el valor de MiVariable
             NombreClase._MiPropiedad = NombreClase.MiVariable
        End Sub


    Ese es el motivo que la propiedad MiPropiedad SIEMPRE devuelva el valor que se le asigno en la declaración de la propiedad. ¿Que MiVariable vale True? Éste será su valor. ¿Que vale False? Éste será el valor que siempre devolverá.

    Para que devuelva otro valor diferente tienes que asignárselo explícitamente al valor del campo creado por el compilador, que digamos está "oculto" pero que se puede acceder perfectamente desde cualquier parte de la clase donde se declaró la propiedad compartida:

     
        _MiPropiedad = True
        _MiPropiedad = False

    Ten en cuenta que por mucho que quieras "compactar" tu código, después el compilador de Visual Basic, C#, o cualquier otro lenguaje, escribirá el código que estime oportuno, que en definitiva será el código que se ejecute, por muchas líneas que hayamos quitado del mismo.

    La siguiente declaración de propiedad queda muy "compactada":

        Public Shared ReadOnly Property MiPropiedad As Boolean = MiVariable

    Pero después el compilador hace caso omiso de tal "compactación" y escribe el procedimiento Property como se ha hecho en Visual Basic desde que éste admite propiedades en sus clases. ;-)

    Conclusión: si en distintas partes de tu clase vas a hacer uso de los campos privados cuyos valores son devueltos por las propiedades correspondientes (procedimientos Property), olvídate de las propiedades implementadas automáticamente y declara un campo privado y su correspondiente procedimiento Property (con sus bloques Get y Set), o solamente su bloque Get si la propiedad es de sólo lectura. Eso por un lado, y por otro, si vas a utilizar código propio en los bloques Get y Set de una propiedad, como por ejemplo, validar el valor que se le desea asignar a un campo, no te va a quedar más remedio que implementar el procedimiento Property como se ha hecho toda la vida. ;-)


    Enrique Martínez Montejo
    [MS MVP - Visual Studio y Tecnologías de Desarrollo]

    Nota informativa: La información contenida en este mensaje, así como el código fuente incluido en el mismo, se proporciona «COMO ESTÁ», sin garantías de ninguna clase, y no otorga derecho alguno. Usted asume cualquier riesgo al poner en práctica, utilizar o ejecutar lo recomendado o sugerido en el presente mensaje.

    Si esta respuesta le ha resultado útil, recuerde marcarla como satisfactoria.

    Si usas Visual Basic .NET y deseas ser productivo y feliz, se inteligente y activa la instrucción
    Option Strict.





    domingo, 6 de noviembre de 2016 22:25
    Moderador

Todas las respuestas

  • La primera modalidad devuelve siempre el valor de MiVariable en todo momento. La segunda se inicializa con MiVariable, pero si con posterioridad MiVariable cambia de valor, MiPropiedad sigue devolviendo el valor que cargó al principio.
    • Marcado como respuesta James-2016 domingo, 6 de noviembre de 2016 23:00
    domingo, 6 de noviembre de 2016 21:47
  • "James-2016" escribió:

    > En este caso particular:
    >
    >  Public Shared ReadOnly Property MiPropiedad() As Boolean
    >     Get
    >       Return MiVariable 'Digamos que MiVariable es una variable booleana cualquiera
    >     End Get
    >  End Property
    >
    > Esta línea de abajo no es equivalente noo?
    >
    >
    >  Public Shared ReadOnly Property MiPropiedad As Boolean = MiVariable
    >
    >
    > ¿Cuál es exactamente la diferencia?

    Ampliando la respuesta de Alberto, el motivo de que en el segundo supuesto la propiedad MiPropiedad SIEMPRE devuelva el valor que se le asigno (MiVariable), es porque tu estás haciendo uso de una propiedad implementada automáticamente, por lo que a la hora de compilar tu proyecto, el compilador de Visual Basic creará un campo privado (y compartido en éste caso), que será el valor que devuelva la propiedad MiPropiedad.

    Para que te hagas una idea. Si tu escribes:

        Public Shared ReadOnly Property MiPropiedad As Boolean = MiVariable

    El compilador generará automáticamente el siguiente código:

        ' Un campo privado y compartido de respaldo cuyo nombre será igual
        ' que el de la propiedad pero comienza con un guión bajo.
        '
        Private Shared _MiPropiedad As Boolean
    
        ' La estructura de la propiedad como siempre se ha escrito.
        '
        Public Shared ReadOnly Property MiPropiedad As Boolean
            Get
                ' Devuelve el valor del campo creado.
                Return Form1._MiPropiedad
            End Get
        End Property

    De ahí que la propiedad llamada MiPropiedad siempre devolverá el valor del campo creado de respaldo por el compilador (_MiPropiedad).

    Y en el constructor compartido de la clase donde hayas declarado la propiedad, el compilador incluirá el siguiente código:

        Shared Sub New()
    
             ' Asignar al campo "oculto" el valor de MiVariable
             NombreClase._MiPropiedad = NombreClase.MiVariable
        End Sub


    Ese es el motivo que la propiedad MiPropiedad SIEMPRE devuelva el valor que se le asigno en la declaración de la propiedad. ¿Que MiVariable vale True? Éste será su valor. ¿Que vale False? Éste será el valor que siempre devolverá.

    Para que devuelva otro valor diferente tienes que asignárselo explícitamente al valor del campo creado por el compilador, que digamos está "oculto" pero que se puede acceder perfectamente desde cualquier parte de la clase donde se declaró la propiedad compartida:

     
        _MiPropiedad = True
        _MiPropiedad = False

    Ten en cuenta que por mucho que quieras "compactar" tu código, después el compilador de Visual Basic, C#, o cualquier otro lenguaje, escribirá el código que estime oportuno, que en definitiva será el código que se ejecute, por muchas líneas que hayamos quitado del mismo.

    La siguiente declaración de propiedad queda muy "compactada":

        Public Shared ReadOnly Property MiPropiedad As Boolean = MiVariable

    Pero después el compilador hace caso omiso de tal "compactación" y escribe el procedimiento Property como se ha hecho en Visual Basic desde que éste admite propiedades en sus clases. ;-)

    Conclusión: si en distintas partes de tu clase vas a hacer uso de los campos privados cuyos valores son devueltos por las propiedades correspondientes (procedimientos Property), olvídate de las propiedades implementadas automáticamente y declara un campo privado y su correspondiente procedimiento Property (con sus bloques Get y Set), o solamente su bloque Get si la propiedad es de sólo lectura. Eso por un lado, y por otro, si vas a utilizar código propio en los bloques Get y Set de una propiedad, como por ejemplo, validar el valor que se le desea asignar a un campo, no te va a quedar más remedio que implementar el procedimiento Property como se ha hecho toda la vida. ;-)


    Enrique Martínez Montejo
    [MS MVP - Visual Studio y Tecnologías de Desarrollo]

    Nota informativa: La información contenida en este mensaje, así como el código fuente incluido en el mismo, se proporciona «COMO ESTÁ», sin garantías de ninguna clase, y no otorga derecho alguno. Usted asume cualquier riesgo al poner en práctica, utilizar o ejecutar lo recomendado o sugerido en el presente mensaje.

    Si esta respuesta le ha resultado útil, recuerde marcarla como satisfactoria.

    Si usas Visual Basic .NET y deseas ser productivo y feliz, se inteligente y activa la instrucción
    Option Strict.





    domingo, 6 de noviembre de 2016 22:25
    Moderador
  • mm ya entiendo, gracias.
    domingo, 6 de noviembre de 2016 22:59
  • jajaja sorry la terquedad, tenía que averiguarlo, dicen que malogrando se aprende (menos mal no aprendo medicina).

    Ya veo que tan compacto no resulta el código, por el contrario el compilador al final de cuentas vuelve a generar el mismo código al crear el campo privado... y aunque mantiene su valor no es tampoco una constante, porque como dice en su respuesta es posible acceder incluso al campo privado y cambiarle el valor.

    Ok es preferible declarar un campo privado y su correspondiente procedimiento Property.

    Muchas gracias por la respuesta, muy ilustrativa.

    domingo, 6 de noviembre de 2016 23:08