Domanda

Qual è la differenza tra l'utilizzo di Proprietà private anziché Campi privati ??

private String MyValue { get; set; }

// instead of

private String _myValue;

public void DoSomething()
{
   MyValue = "Test";

   // Instead of

   _myValue = "Test";
}

C'è qualche problema di prestazioni? o solo una convenzione di denominazione?

È stato utile?

Soluzione

Le proprietà private ti consentono di astrarre i tuoi dati interni in modo che le modifiche alla rappresentazione interna non debbano influire su altre parti dell'implementazione, anche nella stessa classe. I campi privati ??non offrono questo vantaggio. Con le proprietà automatiche in C # 3.0, raramente vedo la necessità di implementare direttamente i campi - privati ??o pubblici.

Altri suggerimenti

Il grande guadagno che puoi ottenere da una proprietà (privata, pubblica, ...) è che può produrre un valore calcolato rispetto a un valore impostato. Ad esempio

class Person { 
  private DateTime _birthday;
  private int _age { get { return (DateTime.Now - _birthday).TotalYears; }
}

Il vantaggio di questo modello è che solo un valore deve essere aggiornato affinché N altri valori riflettano la modifica. Questo vale per le proprietà indipendentemente dall'accessibilità. Non vi è alcun vantaggio specifico di una proprietà privata rispetto a una proprietà non privata (a parte il fatto che è privata ovviamente)

Raramente vorresti rendere privata una proprietà. La disposizione per una proprietà privata è fornita solo per motivi di completezza. E se la tua proprietà sta semplicemente ottenendo / impostando il valore del campo, allora non ci sono differenze di prestazioni perché molto probabilmente sarà delineato dal compilatore JIT.

Oltre a ciò a cui è già stata data risposta, Prestazioni, caratteristiche e completezza c'è un caso valido che ho visto per proprietà private anziché un campo privato:

public class Item
{
    private Item _parent;
    private List<Item> _children;

    public void Add(Item child)
    {
        if (child._parent != null)
        {
            throw new Exception("Child already has a parent");
        }
        _children.Add(child);
        child._parent=this;
    }
}

Diciamo che non vogliamo esporre Parent per qualsiasi motivo, ma potremmo anche voler fare controlli di validazione. Un genitore dovrebbe essere in grado di essere aggiunto da bambino a uno dei suoi figli?

Per risolvere questo problema, puoi renderlo una proprietà ed eseguire un controllo per i riferimenti circolari.

L'accesso alle proprietà sarà (frazionalmente) più lento poiché chiamerà il getter / setter. Il vantaggio è che puoi eseguire la convalida dei dati, che può quindi filtrare fino agli eredi se modifichi la proprietà da proteggere, ad esempio.

Quando si ha a che fare con l'accesso privato, le differenze sono molto piccole. Sì, si verifica un hit delle prestazioni (che può essere ottimizzato da JIT) che invia le proprietà rappresentano una chiamata al metodo, anziché un accesso diretto all'indirizzo.

Il principale vantaggio dell'uso delle proprietà è quello di consentire la modifica dell'implementazione senza cambiare la firma esterna richiesta. Poiché questi sono accessibili privatamente, qualsiasi modifica all'implementazione ha effetto solo sul codice locale.

Quando ho a che fare con membri privati, non vedo alcun vantaggio ottenuto dalle proprietà, ad eccezione delle convenzioni della tua squadra.

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