2014-12-20 10 views
8

Sono consapevole dei vantaggi dell'utilizzo delle proprietà sui campi, come la possibilità di fornire una logica aggiuntiva quando richiesto in futuro.Perché non possiamo utilizzare i campi pubblici per l'associazione dei dati in C#?

Ma mi chiedo davvero perché non è possibile utilizzare i campi pubblici per l'associazione dei dati o anche per i serializzatori JSON come la classe JavaScriptSerializer.

C'è qualche buona ragione per ignorare i campi pubblici in questi casi? O è solo una specie di convenzione? O solo per costringere gli utenti a usare le proprietà?

risposta

6

La versione abbreviata è quella che utilizza sempre le proprietà al posto dei campi public (o, addirittura, anche protected) è stata una scelta di progettazione fondamentale in .NET fin dall'inizio.

La versione leggermente più lunga è che l'aggiunta del supporto per i campi public aggiungerebbe complessità al framework di associazione dei dati (a prescindere da quello a cui ci si sta riferendo). I campi inoltre non hanno alcun tipo di supporto per la notifica dei cambiamenti, che è un aspetto abbastanza importante dell'associazione dei dati (almeno in un ambiente con stato come lo sviluppo di Winforms). Anche a livello di recupero e impostazione di valori, campi e proprietà sono diversi; mentre la sintassi in VB.NET o C# per il recupero o l'impostazione del valore di una proprietà è (in base alla progettazione) uguale a quella di un campo, il meccanismo utilizzato per farlo in uno scenario programmatico come l'associazione dati è diverso per le proprietà vs. campi.

Alla fine, tutto ciò significa solo che ci vorrebbe più lavoro per aggiungere il supporto per i campi pubblici a qualsiasi scenario di associazione dati, quindi dal momento che si tratta di un anti-pattern comunque questo lavoro non è fatto.

3

Non esiste alcuna ragione tecnica alla base di questa restrizione: è certamente possibile aggiungere campi pubblici all'elenco di proprietà e consentire il collegamento a tali campi. Infatti, in .NET ci sono API che selezionerebbero automaticamente una proprietà o un campo pubblico, basandosi solo su un nome. Ad esempio, il numero Expression di LINQ ha il metodo PropertyOrField che sceglierà l'uno o l'altro, in base al tipo restituito dall'espressione nel suo primo parametro.

Tuttavia, lasciare i campi pubblici ti espone a una tale serie di potenziali problemi, che i progettisti di sistemi dipendenti dalla riflessione spesso cercano di scoraggiare l'uso di campi pubblici trattenendo il supporto per loro dal loro design di sistema.

Inoltre, nei sistemi che si basano su eventi per il binding, l'utilizzo di un campo non sarebbe possibile per motivi tecnici, poiché non è possibile attivare un evento impostando un campo pubblico.

+0

I * vorrei * dire che c'è una limitazione tecnica su di essi in qualcosa come Winforms o l'associazione dati MVVM, poiché entrambi fanno affidamento sugli eventi attivati ​​quando i valori cambiano per aggiornare l'interfaccia utente. Tale notifica non è possibile con i campi. –

0

Poiché non è possibile dichiarare campi nelle interfacce, non utilizzare i campi pubblici. Tutti i campi devono essere solo privati.

Se il codice dipende dalle astrazioni, è necessario utilizzare le interfacce e qui i campi pubblici non sono disponibili.

+0

Sebbene questi siano entrambi dei buoni punti, questi spiegano perché l'utilizzo delle proprietà è la scelta di progettazione preferita, non perché il supporto di campo non è presente negli scenari di associazione dei dati. –