Pregunta

En .NET, si una clase contiene un miembro que es un objeto de clase, ¿debería exponerse ese miembro como una propiedad o con un método?

¿Fue útil?

Solución

Si todo lo que está haciendo es exponer una instancia de objeto que sea relevante para el estado del objeto actual, debe usar una propiedad.

Se debe usar un método cuando tiene alguna lógica que está haciendo más que acceder a un objeto en memoria y devolver ese valor o cuando está realizando una acción que tiene un efecto amplio en el estado del objeto actual.

Otros consejos

Debería usar propiedades para cualquier cosa que represente conceptualmente el estado del objeto, siempre que su recuperación no sea una operación lo suficientemente costosa como para evitar usarlo repetidamente.

De MSDN :

  

Los diseñadores de bibliotecas de clases a menudo deben decidir entre implementar un miembro de la clase como una propiedad o un método. En general, los métodos representan acciones y las propiedades representan datos. Use las siguientes pautas para ayudarlo a elegir entre estas opciones.

     
      
  • Use una propiedad cuando el miembro es un miembro de datos lógicos. En las siguientes declaraciones de miembros, Nombre es una propiedad porque es un miembro lógico de la clase.

    public string Name
    get 
    {
        return name;
    }
    set 
    {
        name = value;
    }
    
  •   
  • Use 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 debería considerar el almacenamiento en caché del resultado.
    •   
    • Obtener un valor de propiedad utilizando el descriptor de acceso get 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 una matriz. 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 Métodos crea una copia de la matriz. Como resultado, se crearán 2n + 1 copias de la matriz en el siguiente bucle.

      Type type = // Get a type.
      for (int i = 0; i < type.Methods.Length; i++)
      {
         if (type.Methods[i].Name.Equals ("text"))
         {
            // Perform some operation.
         }
      }
      
    •   
  •   
     

El siguiente ejemplo ilustra el uso correcto de propiedades y métodos.

    class Connection
    {
       // The following three members should be properties
       // because they can be set in any order.
       string DNSName {get{};set{};}
       string UserName {get{};set{};}
       string Password {get{};set{};}

       // The following member should be a method
       // because the order of execution is important.
       // This method cannot be executed until after the 
       // properties have been set.
       bool Execute ();
    }

Eso es irrelevante para el asunto.

Debería ser una Propiedad si el valor es algún detalle sobre el estado del objeto.

Debería ser Método si realiza alguna acción sobre el objeto.

Propiedad. Una propiedad es básicamente un método "barato". Obtener o establecer una referencia a un objeto es bastante barato.

Solo para aclarar, se supone que las propiedades representan el estado interno de un objeto. Sin embargo, la implementación de un miembro como propiedad o método le dice al usuario lo costosa que puede ser la llamada.

Las propiedades leen y asignan valores a instancias dentro de una clase.

Los métodos hacen algo con los datos asignados a la clase.

Descripción general

Generalmente, las propiedades almacenan datos para un objeto, como Nombre , y los métodos son acciones que se le puede pedir a un objeto que realice, como Mover o Mostrar A veces no es obvio qué miembros de la clase deberían ser propiedades y cuáles deberían ser métodos: el método Elemento de una clase de colección (VB) almacena y recupera datos y puede implementarse como una propiedad indexada. Por otro lado, también sería razonable implementar Item como método.

Sintaxis

Cómo se va a utilizar un miembro de la clase también podría ser un factor determinante para determinar si debe representarse como una propiedad o un método. La sintaxis para recuperar información de una propiedad parametrizada es casi idéntica a la sintaxis utilizada para un método implementado como una función. Sin embargo, la sintaxis para modificar dicho valor es ligeramente diferente.

Si implementa el miembro de una clase como una propiedad, debe modificar su valor de esta manera:

ThisObject.ThisProperty (Index) = NewValue

si el miembro de la clase se implementa como un método, el valor que se modifica debe modificarse mediante un argumento:

ThisObject.ThisProperty (Index, NewValue)

Errors

Un intento de asignar un valor a una propiedad de solo lectura devolverá un mensaje de error diferente que una llamada similar a un método. Los miembros de clase implementados correctamente devuelven mensajes de error que son más fáciles de interpretar.

Confundí sobre el uso de la propiedad y el método antes. Pero ahora estoy usando esta regla de acuerdo con Directriz de MSDN :

Los métodos

representan acciones y las propiedades representan datos. Las propiedades están destinadas a ser utilizadas como campos, lo que significa que las propiedades no deben ser computacionalmente complejas ni producir efectos secundarios. Cuando no viole las siguientes pautas, considere usar una propiedad, en lugar de un método, porque los desarrolladores menos experimentados encuentran las propiedades más fáciles de usar.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top