Compartilhar via


CA1024: usar propriedades quando apropriado

TypeName

UsePropertiesWhereAppropriate

CheckId

CA1024

Categoria

Microsoft.Design

Alteração Significativa

Quebra

Causa

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

Descrição da Regra

Na maioria dos casos, as propriedades representam dados e os métodos executam ações.As propriedades são acessadas como campos, que os torna mais fácil usar.Um método é uma boa candidata a se tornar uma propriedade se uma destas condições estiver presente:

  • Não usa nenhum argumento e retorna informações do estado de um objeto.

  • Aceita um único argumento para definir qualquer parte do estado de um objeto.

As propriedades devem se comportar como se fossem campos; se o método não pode, não deve ser alterado para uma propriedade.Os métodos são melhor do que propriedades nas seguintes situações:

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

  • O método executa uma conversão.Acessando um campo não retorna uma versão convertida de dados que armazenam.

  • O método obter tem um efeito colateral observável.Recuperando o valor de um campo não gerencia nenhum efeito colateral.

  • A ordem de execução é importante.Defina o valor de um campo não confie na ocorrência de outras operações.

  • Chame o método duas vezes cria sucessivamente resultados diferentes.

  • O método é estática mas retorna um objeto que pode ser modificado pelo chamador.Recuperar o valor de um campo não permite que o chamador modificar os dados que são armazenados pelo campo.

  • O método retorna uma matriz.

Como Corrigir Violações

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

Quando Suprimir Alertas

Suprima um aviso dessa regra se o método localiza pelo menos um dos critérios listados anteriormente.

Expansão de controle da propriedade no depurador

Os desenvolvedores de uma razão para usar uma propriedade é porque não desejam que o depurador automática para a expanda.Por exemplo, a propriedade pode envolver atribuir um objeto grande ou chame um P/Invoke, mas não pode realmente ter nenhum efeito colateral perceptíveis.

Você pode evitar o depurador propriedades automática expandindo aplicando DebuggerBrowsableAttribute.O exemplo a seguir mostra esse atributo que está sendo aplicado a uma propriedade da instâ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 
{ 
    public class TestClass 
    { 
        // [...] 

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

        }
    }
}

Exemplo

O exemplo a seguir contém vários métodos que devem ser convertidos em propriedades, e vários que não devem porque não se comportam como 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();
      }
   }
}