Partilhar via


Use propriedades onde for apropriado

TypeName

UsePropertiesWhereAppropriate

CheckId

CA1024

Category (Categoria)

Microsoft.Design

Quebrando alterar

Quebrando

Causa

Um método público ou protegido tem um nome que começa com Get, não usa nenhum parâmetro e retorna um valor que não seja uma matriz.

Descrição da regra

Na maioria dos casos, propriedades representam dados e métodos de realizar ações.As propriedades são acessadas como os campos, que os torna mais fácil de usar.Um método é um mercadoria candidato para se tornar uma propriedade se uma das seguintes condições estiverem presente:

  • Não requer argumentos e retorna as informações de estado de um objeto.

  • Aceita um único argumento para conjunto alguma parte do estado de um objeto.

Propriedades devem se comportar sistema autônomo se fossem campos; se o método não for possível, ele não ser alterado para uma propriedade.Métodos são preferível a propriedades nas seguintes situações:

  • O método executa uma operação demorada.O método é perceivably mais lento do que o time necessário para conjunto ou obter o valor do campo.

  • O método executará uma conversão.Acessar um campo não retorna uma versão convertida de dados que ele armazena.

  • O método Get tem um efeito colateral observável.Recuperar o valor do campo não produzem qualquer efeitos colaterais.

  • A ordem de execução é importante.Definir o valor de um campo não depende de outras operações que ocorreu.

  • Chamar o método duas vezes em sucessão cria resultados diferentes.

  • O método for estático, mas retorna um objeto que pode ser alterado pelo chamador.Recuperar o valor do campo não permite que o chamador alterar os dados armazenados pelo campo.

  • O método retorna uma matriz.

Como corrigir violações

Para corrigir uma violação dessa regra, altere o método a uma propriedade.

Quando suprimir avisos

Elimina um aviso essa regra se o método de atender a pelo menos um dos critérios listados anteriormente.

Controlando a expansão de propriedade no depurador

Um motivo para programadores evitar o uso de uma propriedade é o fato de eles não desejam que o depurador para expandir automaticamente.Por exemplo, a propriedade pode envolver a alocação de um objeto grande ou chamar um P/Invoke, mas ele talvez não tenha realmente efeitos colaterais observáveis.

Você pode impedir que o depurador expansão automática propriedades aplicando System.Diagnostics.DebuggerBrowsableAttribute. O exemplo a seguir mostra esse atributo seja aplicado a uma propriedade da ocorrência.

Imports System 
Imports System.Diagnostics 

Namespace Microsoft.Samples 

    Public Class TestClass 

        ' [...] 

        <DebuggerBrowsable(DebuggerBrowsableState.Never)> _ 
        Public ReadOnly Property LargeObject() As LargeObject 
            Get 
                ' Allocate large object 
                ' [...] 
            End Get 
        End Property 

    End Class 

End Namespace
using System; 
using System.Diagnostics; 

namespace Microsoft.Samples 
{ 
    publicclass TestClass 
    { 
        // [...] 

        [DebuggerBrowsable(DebuggerBrowsableState.Never)] 
        public LargeObject LargeObject 
        { 
            get 
            { 
                // Allocate large object 
                // [...] 

        }
    }
}

Exemplo

O exemplo a seguir contém diversos métodos que deve ser convertido em Propriedades e vários que deve não porque não se comportarem como os campos.

using System;
using System.Globalization;
using System.Collections;
namespace DesignLibrary
{
   // Illustrates the behavior of rule: 
   //  UsePropertiesWhereAppropriate.

   public class Appointment
   {
      static long nextAppointmentID;
      static double[] discountScale = {5.0, 10.0, 33.0};
      string customerName;
      long customerID;
      DateTime when;

      // Static constructor.
      static Appointment()
      {
         // Initializes the static variable for Next appointment ID.
      }

      // This method will violate the rule, but should not be a property.
      // This method has an observable side effect. 
      // Calling the method twice in succession creates different results.
      public static long GetNextAvailableID()
      {
         nextAppointmentID++;
         return nextAppointmentID - 1;
      }

      // This method will violate the rule, but should not be a property.
      // This method performs a time-consuming operation. 
      // This method returns an array.

      public Appointment[] GetCustomerHistory()
      {
         // Connect to a database to get the customer's appointment history.
         return LoadHistoryFromDB(customerID);
      }

      // This method will violate the rule, but should not be a property.
      // This method is static but returns a mutable object.
      public static double[] GetDiscountScaleForUpdate()
      {
         return discountScale;
      }

      // This method will violate the rule, but should not be a property.
      // This method performs a conversion.
      public string GetWeekDayString()
      {
         return DateTimeFormatInfo.CurrentInfo.GetDayName(when.DayOfWeek);
      }

      // These methods will violate the rule, and should be properties.
      // They each set or return a piece of the current object's state.

      public DayOfWeek GetWeekDay ()
      {
         return when.DayOfWeek;
      }

      public void  SetCustomerName (string customerName)
      {
         this.customerName = customerName;
      }
      public string GetCustomerName ()
      {
         return customerName;
      }

     public void SetCustomerID (long customerID)
      {
         this.customerID = customerID;
      }

      public long GetCustomerID ()
      {
         return customerID;
      }

      public void SetScheduleTime (DateTime when)
      {
         this.when = when;
      }

      public DateTime GetScheduleTime ()
      {
         return when;
      }

      // Time-consuming method that is called by GetCustomerHistory.
      Appointment[] LoadHistoryFromDB(long customerID)
      {
         ArrayList records = new ArrayList();
         // Load from database.
         return (Appointment[])records.ToArray();
      }
   }
}