Domanda

In .NET, se una classe contiene un membro che è un oggetto classe, quel membro dovrebbe essere esposto come una proprietà o con un metodo?

È stato utile?

Soluzione

Se tutto ciò che stai facendo è esporre un'istanza di un oggetto rilevante per lo stato dell'oggetto corrente, dovresti usare una proprietà.

Un metodo dovrebbe essere usato quando si ha una logica che sta facendo più che accedere a un oggetto in memoria e restituire quel valore o quando si sta eseguendo un'azione che ha un ampio effetto sullo stato dell'oggetto corrente.

Altri suggerimenti

Dovresti usare le proprietà per tutto ciò che rappresenta concettualmente lo stato dell'oggetto, purché il suo recupero non sia un'operazione abbastanza costosa da evitare di usarlo ripetutamente.

Da MSDN :

  

I progettisti di librerie di classi spesso devono decidere tra l'implementazione di un membro di classe come proprietà o metodo. In generale, i metodi rappresentano azioni e le proprietà rappresentano i dati. Usa le seguenti linee guida per aiutarti a scegliere tra queste opzioni.

     
      
  • Utilizzare una proprietà quando il membro è un membro di dati logici. Nelle seguenti dichiarazioni dei membri, Nome è una proprietà perché è un membro logico della classe.

    public string Name
    get 
    {
        return name;
    }
    set 
    {
        name = value;
    }
    
  •   
  • Usa un metodo quando:

         
        
    • L'operazione è una conversione, ad esempio Object.ToString.
    •   
    • L'operazione è abbastanza costosa da voler comunicare all'utente che dovrebbero prendere in considerazione la memorizzazione nella cache del risultato.
    •   
    • Ottenere un valore di proprietà usando l'accessor get avrebbe un effetto collaterale osservabile.
    •   
    • Chiamare il membro due volte in successione produce risultati diversi.
    •   
    • L'ordine di esecuzione è importante. Nota che le proprietà di un tipo dovrebbero poter essere impostate e recuperate in qualsiasi ordine.
    •   
    • Il membro è statico ma restituisce un valore che può essere modificato.
    •   
    • Il membro restituisce un array. Le proprietà che restituiscono array possono essere molto fuorvianti. Di solito è necessario restituire una copia dell'array interno in modo che l'utente non possa modificare lo stato interno. Questo, unito al fatto che un utente può facilmente supporre che sia una proprietà indicizzata, porta a un codice inefficiente. Nel seguente esempio di codice, ogni chiamata alla proprietà Methods crea una copia dell'array. Di conseguenza, nel ciclo seguente verranno create 2n + 1 copie dell'array.

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

Il seguente esempio illustra l'uso corretto di proprietà e metodi.

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

Questo è irrilevante per la questione.

Dovrebbe essere una proprietà se il valore è un dettaglio sullo stato dell'oggetto.

Dovrebbe essere Metodo se esegue un'azione sull'oggetto.

Proprietà. Una proprietà è fondamentalmente solo un metodo "economico". Ottenere o impostare un riferimento a un oggetto è piuttosto economico.

Giusto per chiarire, le proprietà di solito dovrebbero rappresentare lo stato interno di un oggetto. Tuttavia, l'implementazione di un membro come proprietà o metodo indica all'utente quanto è probabile che la chiamata sia costosa.

Le proprietà leggono e assegnano i valori alle istanze all'interno di una classe.

I metodi fanno qualcosa con i dati assegnati alla classe.

Introduzione

In generale, le proprietà archiviano i dati per un oggetto, come Nome , e i metodi sono azioni che un oggetto può essere richiesto di eseguire, come Sposta o Mostra . A volte non è ovvio quali membri della classe debbano essere proprietà e quali dovrebbero essere i metodi: il metodo Item di una classe di raccolta (VB) archivia e recupera i dati e può essere implementato come proprietà indicizzata. D'altra parte, sarebbe anche ragionevole implementare Item come metodo.

Sintassi

Il modo in cui un membro della classe verrà utilizzato potrebbe anche essere un fattore determinante per stabilire se debba essere rappresentato come proprietà o metodo. La sintassi per il recupero di informazioni da una proprietà con parametri è quasi identica alla sintassi utilizzata per un metodo implementato come funzione. Tuttavia, la sintassi per modificare tale valore è leggermente diversa.

Se si implementa il membro di una classe come proprietà, è necessario modificarne il valore in questo modo:

ThisObject.ThisProperty (Index) = NewValue

se il membro della classe è implementato come metodo, il valore che si sta modificando deve essere modificato usando un argomento:

ThisObject.ThisProperty (Index, NewValue)

Errori

Un tentativo di assegnare un valore a una proprietà di sola lettura restituirà un messaggio di errore diverso rispetto a una chiamata simile a un metodo. I membri della classe implementati correttamente restituiscono messaggi di errore più facili da interpretare.

Ho confuso circa l'utilizzo della proprietà e del metodo prima. Ma ora sto usando questa regola secondo Linee guida MSDN :

I metodi

??rappresentano azioni e le proprietà rappresentano i dati. Le proprietà sono pensate per essere usate come campi, il che significa che le proprietà non dovrebbero essere complesse dal punto di vista computazionale o produrre effetti collaterali. Quando non viola le seguenti linee guida, considera l'utilizzo di una proprietà, piuttosto che un metodo, perché gli sviluppatori meno esperti trovano le proprietà più facili da usare.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top