Sdílet prostřednictvím


CA1024: Použijte vlastnosti, kde je to vhodné

TypeName

UsePropertiesWhereAppropriate

CheckId

CA1024

Kategorie

Microsoft.Design

Narušující změna

Narušující

Příčina

Veřejné nebo chráněná metoda má název začínající na Get, nepřijímá žádné parametry a vrací hodnotu, která není polem.

Popis pravidla

Ve většině případů představují vlastnosti data a metody provádějí akce.Ke vlastnostem lze přistoupit jako k polím, což usnadňuje jejich použití.Je-li jedna z následujících podmínek splněna, je metoda dobrým kandidátem stát se vlastností:

  • Nevyžaduje žádné argumenty a vrací informace o stavu objektu.

  • Přijímá jediný argument a nastavuje některou část stavu objektu.

Vlastnosti by se měly chovat jako pole; pokud to metoda nedokáže, neměla by být změněna na vlastnost.V následujících situacích jsou metody lepší než vlastnosti:

  • Metoda provádí časově náročnou operaci.Metoda je citelně pomalejší než načítání či ukládání hodnoty pole.

  • Metoda provádí převod.Přístup k poli nevrací převedenou verzi uložených dat.

  • Metoda Get má pozorovatelný vedlejší účinek.Načítání hodnoty pole žádné vedlejší účinky nemá.

  • Je důležité pořadí spouštění.Nastavení hodnoty pole nespoléhá na výskyt jiných operací.

  • Volání metody dvakrát za sebou přináší různé výsledky.

  • Metoda je statická, ale vrací objekt, který lze upravit volajícím.Načtení hodnoty pole neumožňuje volajícímu změnit data v tomto poli uložená.

  • Metoda vrací pole.

Jak vyřešit porušení

Chcete-li opravit porušení tohoto pravidla, změňte metodu na vlastnost.

Kdy potlačit upozornění

Varování tohoto pravidla potlačte, pokud metoda splňuje alespoň jedno z předešlých kritérií.

Řízení rozbalování vlastností v ladicím programu

Jedním z důvodů, proč se programátoři vyhýbají použití vlastností, je automatické rozbalování vlastností ladicím programem.Vlastnost může například zahrnovat přidělování paměti velkému objektu nebo volání nespravovaného kódu, ale nemusí mít žádné pozorovatelné vedlejší účinky.

Ladicímu programu lze zabránit v automatickém rozbalování vlastností použitím atributu DebuggerBrowsableAttribute.Následující příklad ukazuje použití tohoto atributu na vlastnost instance.

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 
                // [...] 

        }
    }
}

Příklad

Následující příklad obsahuje několik metod, které by měly být převedeny na vlastnosti, a několik metod, které by převedeny být neměly, protože se nechovají jako pole.

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();
      }
   }
}