È una cattiva pratica usare i campi pubblici? [duplicare]

15

Nel mio tempo come sviluppatore ho imparato che le proprietà possono essere molto utili. Uso le proprietà per controllare l'accesso in lettura e scrittura o per aggiungere qualcosa come i controlli di convalida.

Ma partendo dal presupposto che ho una proprietà auto con un getter pubblico e setter.

public string LastName { get; set; }

In questo caso non vedo alcun punto nell'uso delle proprietà sui campi.

Potrei anche fare quanto segue:

public string LastName;

C'è qualcosa che parla contro un campo pubblico in questo caso? Perché dovrei usare una proprietà?

    
posta Jonathan Egerton 17.08.2012 - 16:18
fonte

3 risposte

20

In generale, sì, usare i campi pubblici invece delle proprietà è una cattiva pratica.

Il framework .NET in genere assume che userete le proprietà invece dei campi pubblici. Ad esempio, il collegamento dati cerca le proprietà per nome:

tbLastName.DataBindings.Add("Text", person, "LastName"); // textbox binding

Ecco alcune cose che puoi fare facilmente con le proprietà ma non con i campi:

  1. Puoi aggiungere una validazione (o qualsiasi altro codice, entro limiti ragionevoli) ai valori di una proprietà:

    private string lastName;
    public string LastName
    {
        get { return lastName; }
        set
        {
            if(string.IsNullOrEmpty(value))
                throw new ArgumentException("LastName cannot be null or empty");
            lastName = value;
        }
    }
    
  2. Puoi modificare facilmente i livelli di accessibilità per getter e setter:

    public string LastName { get; private set; }
    
  3. Puoi utilizzarli come parte di una definizione di interfaccia o di una classe astratta.

Se inizi con i campi pubblici e ritieni che sarà facile passare alle proprietà in seguito, probabilmente incontrerai dei problemi. Se si dispone di un codice in altri assembly che dipende dall'accesso ai campi pubblici, sarà necessario ricostruirlo e ridistribuirli tutti se si passa all'accesso basato su proprietà. Potresti anche avere un codice che usa la riflessione per ottenere i valori ... anche questo dovrebbe essere cambiato.

E se sei veramente sfortunato, quei cambiamenti dovrebbero essere fatti in una parte della base di codice su cui non hai alcun controllo e sarai bloccato a hackerare nei campi pubblici.

Per ulteriori dettagli sanguinosi, consulta l'articolo 1 nel primo capitolo di C # efficace di Bill Wagner.

    
risposta data 17.08.2012 - 16:37
fonte
11

I setter e i getter possono essere modificati senza apportare modifiche all'API di rottura. Questo è il motivo principale per l'utilizzo delle proprietà sui campi. Se sai senza dubbio che non avrai bisogno di modificare il getter / setter, allora potresti essere ok, ma perché rischiare? Dopo tutto, non è come se fosse un grosso inconveniente renderlo una proprietà.

    
risposta data 17.08.2012 - 16:28
fonte
3

È male perché stai esponendo lo stato interno del tuo oggetto e non hai alcun controllo su come lo stato è cambiato. Con getter e setter, puoi almeno ispezionare i dati e modificarli se necessario, in modo che lo stato interno dell'oggetto rimanga coerente (e valido).

    
risposta data 17.08.2012 - 16:41
fonte

Leggi altre domande sui tag