2011-02-18 55 views
30

Acabo de crear varios métodos Property Set y no compilaron. Cuando los cambié a Property Let, todo estaba bien.En VB6, ¿cuál es la diferencia entre Property Set y Property Let?

Desde entonces he estudiado la documentación para encontrar la diferencia entre Property Set y Property Let, pero debo admitir que no es la más sabia. ¿Hay alguna diferencia, y si es así alguien podría ofrecer un puntero a una explicación adecuada?

Respuesta

22

Property Set es para los objetos (por ejemplo, instancias de clases)

Property Let es para tipos de datos "normales" (por ejemplo, cadena, booleana, larga, etc.)

+0

No está relacionado con WithEvents, se trata de devolver referencias de objetos como propiedades. Hay muchas ocasiones en las que desea hacer esto, generalmente cuando tiene algún tipo de jerarquía de objetos. – Bob77

+0

incorrecto 'Property Get' se usa para devolver referencias de objetos como propiedades, no' Property Set'. – mwolfe02

+0

http://msdn.microsoft.com/en-us/library/aa266202(VS.60).aspx: al igual que los procedimientos 'Function' y' Property Get', un procedimiento 'Property Set' es un procedimiento separado que puede tomar argumentos, realizar una serie de declaraciones y cambiar el valor de sus argumentos. ** Sin embargo, a diferencia de los procedimientos 'Function' y' Property Get', que devuelven un valor, solo puede usar un procedimiento 'Property Set' en el lado izquierdo de una asignación de referencia de objeto (instrucción' Set').** – mwolfe02

3

Property Set es para las variables a objetos como (ByRef), mientras que Property Let es para las variables de valor como (ByVal)

+2

No es un problema ByRef vs. ByVal, pero se usa estrictamente para devolver referencias de objeto a la persona que llama. – Bob77

+0

Es cierto que no es un problema ByRef/ByVal. Pero ** no ** se usa para devolver referencias de objetos a la persona que llama. Para eso, usa 'Property Get' de la misma forma que lo haría para devolver cualquier otra propiedad de clase (no hay una versión específica de objeto para devolver las propiedades de clase). – mwolfe02

+0

Sí, tenía eso exactamente al revés, es para asignar a una propiedad del objeto - duh, realmente malo. – Bob77

22

Property Let es más versátil que Property Set. Este último está restringido a referencias de objeto solamente. Si usted tiene esta propiedad en una clase

Private m_oPicture   As StdPicture 

Property Get Picture() As StdPicture 
    Set Picture = m_oPicture 
End Property 

Property Set Picture(oValue As StdPicture) 
    Set m_oPicture = oValue 
End Property 

Property Let Picture(oValue As StdPicture) 
    Set m_oPicture = oValue 
End Property 

Puede llamar Property Set Picture con

Set oObj.Picture = Me.Picture 

Puede llamar Property Let Picture tanto con

Let oObj.Picture = Me.Picture 
oObj.Picture = Me.Picture 

La implementación Property Set es lo que otros desarrolladores esperan para las propiedades que son referencias de objetos pero a veces incluso Microsoft proporciona solo Property Let para propiedades de referencia, lo que lleva al sintaxis sual oObj.Object = MyObject sin declaración Set. En este caso, utilizando la instrucción Set se genera un error de tiempo de compilación o de tiempo de ejecución porque no hay Property Set Object implementado en la clase oObj.

Tiendo a implementar tanto Property Set como Property Let para propiedades de tipos estándar - fuentes, imágenes, etc. - pero con semántica diferente. Por lo general, en Property Let tiendo a realizar una "copia profunda", es decir, clonando el StdFont en lugar de simplemente mantener una referencia al objeto original.

+0

Suponiendo que tiene tanto 'Property Set' como' Property Let' para un tipo de objeto, y suponiendo que el código de implementación es el mismo (como en su ejemplo), ¿tiene VB6 una diferencia incorporada en lo que realmente hará cuando el desarrollador llama a cualquiera de las propiedades? Por ejemplo, ¿VB6 decidirá implícitamente pasar repentinamente el objeto por valor, en lugar de hacerlo por referencia, si el desarrollador llama a la propiedad 'Let', o hay otros pequeños matices como ese? (Sé que dijiste que los que te gusta escribir tienen la semántica por separado, pero no estoy seguro de si el lenguaje hace algo diferente por sí mismo). – Panzercrisis

+0

En VB6 no existe la opción "pasar el objeto por valor" para los parámetros. El uso de 'ByVal oValue As StdPicture' frente a' ByRef oValue As StdPicture' cambia la forma en que se pasa el objeto * reference *. Es como 'StdPicture * oValue' contra' StdPicture ** oValue' en C/C++ - siempre punteros, pero en el segundo caso uno tiene la capacidad de cambiar la * referencia * (por ejemplo, asignar ref a un nuevo objeto) dentro del procedimiento y la persona que llama puede recibir esta nueva referencia. Por lo tanto, no existe una opción de "copia" per se y normalmente estoy usando el método 'Clone' (por ejemplo, en la interfaz' IFont') dentro de 'Property Let' para implementar manualmente la semántica de" deep copy ". – wqw

+0

Para los tipos de referencia, me refiero a pasar la referencia por valor, como en VB.NET/C#. – Panzercrisis