Cuándo usar propiedades en lugar de funciones


Esto es probablemente una cuestión de preferencia personal, pero ¿cuándo utiliza propiedades en lugar de funciones en su código

Por ejemplo, Para obtener un registro de errores podría decir

string GetErrorLog()
{
      return m_ErrorLog;
}

O podría

string ErrorLog
{
     get { return m_ErrorLog; }
}

¿Cómo decides cuál usar? Me parece ser inconsistente en mi uso y estoy buscando una buena regla general de oro. Gracias.

Author: svick, 2009-09-03

6 answers

Tiendo a usar propiedades si lo siguiente es verdadero:

  • La propiedad devolverá un único valor lógico
  • Poca o ninguna lógica está involucrada (normalmente solo devuelve un valor, o realiza una pequeña comprobación/valor de retorno)

Tiendo a usar métodos si los siguientes son verdaderos:

  • Va a haber un trabajo significativo involucrado en devolver el valor, es decir: se obtendrá de una base de datos, o algo que puede tomar "tiempo"
  • Hay un poco de lógica involucrado, ya sea en obtener o establecer el valor

Además, recomiendo mirar Las Directrices de Diseño de Microsoft para el Uso de Propiedades. Sugieren:

Utilice una propiedad cuando el miembro es un miembro de datos lógicos.

Utilice un método cuando:

  • La operación es una conversión, como Object.toString.
  • La operación es lo suficientemente costosa como para que desee comunicar al usuario que debe considerar el almacenamiento en caché resultado.
  • Obtener un valor de propiedad usando el get accessor tendría un efecto secundario observable.
  • Llamar al miembro dos veces seguidas produce resultados diferentes.
  • El orden de ejecución es importante. Tenga en cuenta que las propiedades de un tipo deben poder establecerse y recuperarse en cualquier orden.
  • El miembro es estático pero devuelve un valor que se puede cambiar.
  • El miembro devuelve un array. Las propiedades que devuelven matrices pueden ser muy engañosas. Por lo general, es necesario devolver una copia de la matriz interna para que el usuario no pueda cambiar el estado interno. Esto, junto con el hecho de que un usuario puede asumir fácilmente que es una propiedad indexada, conduce a un código ineficiente. En el siguiente ejemplo de código, cada llamada a la propiedad Methods crea una copia del array. Como resultado, se crearán copias 2n+1 de la matriz en el bucle siguiente.
 68
Author: Reed Copsey,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-09-03 18:40:50

Aquí están las pautas de Microsoft:

Elegir entre Propiedades y Métodos

  • Considere usar una propiedad si el miembro representa un atributo lógico del tipo.

  • Utilice una propiedad, en lugar de un método, si el valor de la propiedad se almacena en la memoria del proceso y la propiedad solo proporcionaría acceso al valor.

  • Utilice un método, en lugar de una propiedad, en las siguientes situaciones.

    • La operación es órdenes de magnitud más lenta de lo que sería un conjunto de campo. Si incluso está considerando proporcionar una versión asíncrona de una operación para evitar bloquear el hilo, es muy probable que la operación sea demasiado costosa para ser una propiedad. En particular, las operaciones que acceden a la red o al sistema de archivos (excepto una vez para inicializar) deberían ser métodos, no propiedades.

    • La operación es una conversión, como la Objeto.Método ToString.

    • La operación devuelve un resultado diferente cada vez que se llama, incluso si los parámetros no cambian. Por ejemplo, el método NewGuid devuelve un valor diferente cada vez que se llama.

    • La operación tiene un efecto secundario significativo y observable. Tenga en cuenta que rellenar una caché interna generalmente no se considera un efecto secundario observable.

    • La operación devuelve una copia de un estado interno (esto no incluir copias de objetos de tipo valor devueltos en la pila).

    • La operación devuelve un array.

 12
Author: Ryan Lundy,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-05-12 14:12:24

Utilizo propiedades cuando su clear la semántica es "Get somevalue from the object". Sin embargo, usar un método es una buena manera de comunicar "esto puede tomar un poco más que un esfuerzo trivial para regresar".

Por ejemplo, una colección podría tener una propiedad Count. Es razonable suponer que un objeto de colección sabe cuántos elementos se mantienen actualmente sin que realmente tenga que recorrerlos y contarlos.

En la mano esta colección hipotética podría tener el método GetSum() que devuelve el total del conjunto de elementos retenidos. La colección simplemente tiene fácilmente una propiedad Sum en su lugar, pero mediante el uso de un método se comunica la idea de que la colección tendrá que hacer algún trabajo real para obtener una respuesta.

 5
Author: AnthonyWJones,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-09-03 15:57:04

Nunca usaría una propiedad si pudiera afectar a más de un campo - siempre usaría un método.

Generalmente, solo uso el cadena pública ErrorLog { get; conjunto privado; } sintaxis para las Propiedades y usar Métodos para todo lo demás.

 2
Author: ssg31415926,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-09-03 15:54:07

Además de la respuesta de Reed cuando la propiedad solo va a ser un getter como obtener un recurso como podría ser un Registro de eventos. Intento y solo uso propiedades cuando la propiedad estará libre de efectos secundarios.

 2
Author: JoshBerke,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-09-03 15:54:52

Si hay algo más que algo trivial sucediendo en una propiedad, entonces debería ser un método. Por ejemplo, si su propiedad ErrorLog getter realmente estaba yendo y leyendo archivos, entonces debería ser un método. Acceder a una propiedad debe ser rápido, y si está haciendo mucho procesamiento, debe ser un método. Si hay efectos secundarios de acceder a una propiedad que el usuario de la clase podría no esperar, entonces probablemente debería ser un método.

Existe Diseño de. NET Framework Guidelines libro que cubre este tipo de cosas con gran detalle.

 2
Author: AaronLS,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-09-03 15:55:33