Nota
El acceso a esta página requiere autorización. Puede intentar iniciar sesión o cambiar directorios.
El acceso a esta página requiere autorización. Puede intentar cambiar los directorios.
Nota:
Este contenido se vuelve a imprimir con el permiso de Pearson Education, Inc. de Directrices de diseño de frameworks: Convenciones, expresiones y patrones para bibliotecas reutilizables de .NET, 2ª Edición. Esa edición fue publicada en 2008, y el libro ha sido totalmente revisado en la tercera edición. Parte de la información de esta página puede estar obsoleta.
Aunque las propiedades son técnicamente muy similares a los métodos, son bastante diferentes en términos de sus escenarios de uso. Deben verse como campos inteligentes. Tienen la sintaxis de llamada propia de los campos y la flexibilidad de los métodos.
✔️ Cree propiedades de solo obtención si el llamador no debe poder cambiar el valor de la propiedad.
Tenga en cuenta que si el tipo de la propiedad es un tipo de referencia mutable, el valor de la propiedad se puede cambiar incluso si la propiedad es de solo obtención.
❌ NO proporcione propiedades que solo permiten escritura ni propiedades cuyo setter tenga una accesibilidad más amplia que el getter.
Por ejemplo, no use propiedades con un setter público y un getter protegido.
Si no se puede proporcionar el captador de propiedades, implemente la funcionalidad como método en su lugar. Considere comenzar el nombre del método con Set y luego continúe con el nombre que le daría a la propiedad. Por ejemplo, AppDomain tiene un método llamado SetCachePath en lugar de tener una propiedad de solo conjunto denominada CachePath.
✔️ PROPORCIONE valores predeterminados razonables para todas las propiedades, lo que garantiza que los valores predeterminados no dan lugar a un agujero de seguridad o a un código terriblemente ineficaz.
✔️ PERMITE establecer propiedades en cualquier orden incluso si esto da como resultado un estado temporal no válido del objeto.
Es habitual que dos o más propiedades estén relacionadas con un punto en el que algunos valores de una propiedad podrían no ser válidos dados los valores de otras propiedades en el mismo objeto. En tales casos, las excepciones resultantes del estado no válido se deben posponer hasta que el objeto use realmente las propiedades relacionadas entre sí.
✔️ Conserve el valor anterior si un establecedor de propiedades produce una excepción.
❌ EVITE lanzar excepciones desde los accesores de propiedades.
Los captadores de propiedades deben ser operaciones simples y no deben tener ninguna condición previa. Si un getter puede lanzar una excepción, es probable que se vuelva a diseñar para que sea un método. Tenga en cuenta que esta regla no se aplica a los indexadores, donde se esperan excepciones como resultado de validar los argumentos.
Diseño de propiedades indexadas
Una propiedad indizada es una propiedad especial que puede tener parámetros y se puede llamar con sintaxis especial similar a la indexación de matrices.
Las propiedades indexadas se conocen normalmente como indexadores. Los indexadores solo se deben usar en las API que proporcionan acceso a los elementos de una colección lógica. Por ejemplo, una cadena es una colección de caracteres y el indizador de System.String se agregó para tener acceso a sus caracteres.
✔️ CONSIDERE la posibilidad de usar indizadores para proporcionar acceso a los datos almacenados en una matriz interna.
✔️ CONSIDERE la posibilidad de proporcionar indizadores en tipos que representan colecciones de elementos.
❌ EVITE el uso de propiedades indexadas con más de un parámetro.
Si el diseño requiere varios parámetros, reconsidere si la propiedad realmente representa un accesor a una colección lógica. Si no lo hace, use métodos en su lugar. Considere la posibilidad de iniciar el nombre del método con Get o Set.
❌ EVITE indizadores con tipos de parámetro distintos de System.Int32, System.Int64, System.String, System.Objecto una enumeración.
Si el diseño requiere otros tipos de parámetros, reevalúe con detenimiento si la API representa realmente un accesor a una colección lógica. Si no es así, use un método . Considere la posibilidad de iniciar el nombre del método con Get o Set.
✔️ DEBES usar el nombre Item para las propiedades indexadas a menos que haya un nombre obviamente mejor (por ejemplo, la propiedad Chars[] en System.String).
En C#, los indizadores se denominan elemento de forma predeterminada. IndexerNameAttribute se puede usar para personalizar este nombre.
❌ NO proporcione tanto un indexador como métodos que sean semánticamente equivalentes.
❌ NO proporcione más de una familia de indexadores sobrecargados en un tipo.
El compilador de C# aplica esto.
❌ No use propiedades indexadas no predeterminadas.
El compilador de C# aplica esto.
Eventos de notificación de cambio de propiedad
A veces resulta útil proporcionar un evento que notifica al usuario los cambios en un valor de propiedad. Por ejemplo, System.Windows.Forms.Control genera un TextChanged evento después de que el valor de su Text propiedad haya cambiado.
✔️ CONSIDERE la posibilidad de generar eventos de notificación de cambios cuando se modifican los valores de propiedad de las API de alto nivel (normalmente componentes del diseñador).
Si hay un buen escenario para que un usuario sepa cuándo cambia una propiedad de un objeto, el objeto debe generar un evento de notificación de cambio para la propiedad .
Sin embargo, es poco probable que valga la pena generar estos eventos para las API de bajo nivel, como los tipos base o las colecciones. Por ejemplo, List<T> no generaría estos eventos cuando se agrega un nuevo elemento a la lista y cambia la Count propiedad.
✔️ CONSIDERE la posibilidad de generar eventos de notificación de cambios cuando el valor de una propiedad cambia a través de fuerzas externas.
Si un valor de propiedad cambia debido a una fuerza externa (de un modo diferente a llamar métodos en el objeto), se generan eventos que indican al desarrollador que el valor está cambiando y ha cambiado. Un buen ejemplo es la Text propiedad de un control de cuadro de texto. Cuando el usuario escribe texto en TextBox, el valor de la propiedad cambia automáticamente.
© Partes 2005, 2009 de Microsoft Corporation. Todos los derechos reservados.
Reimpreso con permiso de Pearson Education, Inc. de Framework Design Guidelines: Convenciones, Idiomas y Patrones para Bibliotecas .NET Reusables, 2ª Edición por Krzysztof Cwalina y Brad Abrams, publicado el 22 de octubre de 2008 por Addison-Wesley Professional como parte de la Serie Desarrollo de Microsoft Windows.