c# - Pregunta de la convención: ¿Cuándo utiliza una función Getter/Setter en lugar de usar una propiedad?
(9)
Me sorprende que las Propiedades en C # se utilicen cuando se trata de manipular un campo de la clase. Pero cuando hay cálculos complicados o bases de datos involucradas, debemos usar un getter / setter.
¿Es esto correcto?
¿Cuándo usas s / getter en las propiedades?
Esto es toda preferencia personal. Cuando se compila, resulta ser funciones getter / setter de cualquier manera.
Personalmente uso propiedades al establecer y recuperar valores de miembros sin ningún efecto secundario. Si hay efectos secundarios para recuperar / guardar el valor, entonces uso una función.
Las pautas de diseño de .NET proporcionan algunas respuestas a esta pregunta en la sección Propiedades vs. Métodos .
Básicamente, las propiedades tienen la misma semántica que un campo. No debe permitir que una propiedad genere excepciones, las propiedades no deberían tener efectos secundarios, el orden no debería importar y las propiedades deberían regresar con relativa rapidez. Si cualquiera de esas cosas pudiera suceder, es mejor usar un método. Las directrices también recomiendan el uso de métodos para devolver matrices.
Al decidir si usar una propiedad o método, ayuda si lo pienso como un campo. Pienso en el comportamiento de la propiedad y me pregunto: "Si este fuera un campo en la clase, ¿me sorprendería si se comportara de la manera en que lo hace?". Considere, por ejemplo, el método TcpClient.GetStream . Puede lanzar varias excepciones en función de si se establece la conexión, y es importante que el TcpClient esté configurado antes de intentar obtener la transmisión. Debido a esto, es un método Get en lugar de una propiedad.
Si le das un buen vistazo a las pautas de diseño, verás que generalmente no es una cuestión de preferencia; hay buenos motivos para usar métodos en lugar de propiedades en ciertos casos.
Las propiedades deben ser rápidas, ya que tienen una cierta promesa de simplemente estar allí. También son obligatorios para la vinculación de datos.
Y no deberían tener efectos secundarios .
Olvídate de los métodos Getter y Setter. Solo usa Propiedades.
Algo interesante de mencionar es que las propiedades terminan como métodos Setter y / o Getter en el ensamblado. Setter y / o Getter se convierten en una propiedad solo con un poco de metadatos. De hecho, propiedades = métodos setter / getter.
Si su idioma admite propiedades, solo use propiedades.
Tiendo a utilizar setters cuando un valor es solo de escritura o hay varios valores para establecer a la vez (obviamente). También mi instinto, como el tuyo, es utilizar getters y setters como una señal de que un proceso puede ser de larga duración, generar hilos o realizar algún otro trabajo no trivial. Además, si un setter tiene prerrequisitos no obvios en la clase, podría usar un getter o setter en su lugar, ya que las personas rara vez leen la documentación de las propiedades, y se espera que las propiedades sean accesibles en todo momento. Pero incluso en estas circunstancias, podría usar una propiedad si potencialmente podría hacer que el código de llamada sea mejor.
Usa las propiedades Una nota interesante del libro de pautas de diseño del marco de trabajo de MS es que si tiene una propiedad y necesita agregar métodos adicionales para establecer / obtener más complejos, entonces debe eliminar la propiedad e ir con solo los métodos get / set.
Yo diría que siempre pregúntate qué tiene más sentido. Los métodos tienden a entenderse como acciones a realizar y generalmente están redactados como tales - open()
, flush()
, parse()
. Las propiedades tienden a entenderse como campos / variables más elegantes: DisplayName
, AutoSize
, DataSource
.
Esto me viene a la mente con el desarrollo de control personalizado que he notado. Dado que tiene el potencial de ser utilizado por muchas otras personas en el camino que no lo escribieron y es posible que no esté cerca para preguntar, mejor vaya con un diseño que tenga sentido lógico y que no sorprenda a sus compañeros desarrolladores.
La respuesta de Microsoft es buena, pero agregaría algunas reglas más para las propiedades de lectura y escritura (que Microsoft viola a veces, por cierto, causando mucha confusión): (1) Un filtro de propiedades generalmente no debería afectar las propiedades observables de objetos que no son considerado como parte del objeto cuya propiedad se está estableciendo; (2) Establecer una propiedad en un valor y luego otra debe dejar cualquier objeto afectado en el mismo estado (observable) que simplemente establecerlo en el segundo valor; (3) Establecer una propiedad al valor devuelto por su getter no debe tener ningún efecto observable; (4) Generalmente, establecer una propiedad no debería hacer cambiar otras propiedades de lectura-escritura, aunque puede cambiar otras propiedades de solo lectura (tenga en cuenta que la mayoría de las violaciones de esta regla violarían el # 2 y / o el 3, pero incluso cuando esas reglas no serían violadas, tales diseños aún parecen dudosos). Hacer que un objeto sea utilizable en el diseñador puede requerir darle algunas propiedades que no sigan estas reglas, pero los cambios en el tiempo de ejecución que no sigan dicha semántica deberían ser realizados por métodos setter.
En muchos casos, puede ser apropiado tener una propiedad de solo lectura y un método "Establecer" por separado (esa sería mi preferencia, por ejemplo, para la propiedad "Principal" de un control). En otros casos, puede ser útil tener varias propiedades ReadOnly relacionadas que se vean afectadas por una propiedad de lectura / escritura (por ejemplo, puede ser útil tener una propiedad de solo lectura que indique si un control y todos sus padres son visibles, pero tales la funcionalidad no se debe incluir en una propiedad Visible de escritura y escritura).