2009-07-03 14 views
7

Ho classi che hanno proprietà automatiche solo come public customerName {get; impostato;}. Sono pubblici perché sono accessibili al di fuori della classe. Possono anche essere accessibili all'interno della classe. Offrono una buona incapsulamento e un migliore debugging. Posso mettere un punto di interruzione su uno se ho bisogno di sapere chi sta accedendo e quando.Svantaggi dell'utilizzo delle proprietà solo senza campi corrispondenti in .NET?

La mia domanda è quali sono gli svantaggi dell'utilizzo delle proprietà solo senza campi corrispondenti? Riesco a rendere il setter o getter privato, interno, ecc., Il che significa che ho anche la flessibilità di esaminarlo quando necessario.

+0

+1 tutto ciò che rivela un caso limite o problemi specifici con qualcosa è una buona domanda per me. (ri: complicazione Marc's BinaryFormatter) – Maslow

risposta

11

serializzazione con BinaryFormatter - avete grossi problemi se è necessario modificare la vostra proprietà per una "normale" proprietà in seguito, ad esempio per aggiungere un po 'di validazione/eventing/etc - sinc BinaryFormatter utilizza i nomi dei campi. E non puoi duplicarlo, dal momento che il nome del campo generato dal compilatore non può essere scritto come C# legale.

Quale è una buona ragione per guardare invece un serializzatore basato sul contratto. Vedi this blog entry per maggiori informazioni.

+0

È brutto, e non qualcosa da considerare, ma - potresti sfogarti controllando il nome del campo automatico in Reflector? – Groo

+1

Questo non aiuta molto - il nome del campo * non può * essere scritto in C# (intenzionalmente) - quindi dovresti implementare 'ISerializable' o un surrogato di serializzazione; molto lavoro solo perché volevi aggiungere la validazione a una proprietà. Ma per sottolineare: la mia risposta qui è "non usare BinaryFormatter" - e continuare a usare gli autopropulsori ;-p –

3

Non ci sono svantaggi per le proprietà semplici. Il compilatore crea il campo di supporto per te. Questo blog entry spiega come il compilatore tratta le proprietà implementate automaticamente.

2

Il fatto è che è un campo corrispondente. Semplicemente non lo vedi perché il compilatore lo crea per te. Le proprietà automatiche sono solo zucchero sintattico o modo stenografico per creare il campo.

5

Non è possibile creare in sola lettura solo proprietà, poiché è necessario definire sia setter che getter. Puoi utilizzare solo setter privato per ottenere proprietà pseudo-readonly dall'esterno.

Altrimenti, come detto sopra, non ci sono altri svantaggi.

1

Nessuna cosa importante. Solo casi limite come dove è necessario passare una proprietà a un metodo in cui il parametro viene passato per riferimento (ref o out) che non è possibile con una proprietà (perché internamente, sono solo metodi get_Property/set_Property implementati dal compilatore , non campi speciali di alcun tipo) e per questo occorrerebbe un esplicito campo di supporto privato.

EDIT: Oh, e il comando delle proprietà 'no readonly', che è in realtà abbastanza comune.

0

Se non è necessario eseguire alcuna logica specifica nella get e/o impostare funzioni di accesso, non c'è nessuno svantaggio ...

0

io dico che sono cattivi dal punto di vista la leggibilità del codice. Lo zucchero di sintassi è piacevole per scrivere codice ma è orribile per leggere il codice. Come sviluppatori, il codice che lasceremo sarà ereditato da qualche povero sviluppatore che dovrà dare un senso a quello che abbiamo fatto e a cosa sta succedendo nel codice. Sono davvero contrario alla modifica di una lingua per salvare semplicemente i tasti quando esiste una sintassi stabilita per gli stessi costrutti.

+4

Non direi che lo rende meno leggibile. Hai un campo in meno da leggere e il codice dice "questa è la proprietà più semplice possibile, è qui solo per consentire l'incapsulamento se ne ho bisogno un giorno". – Groo

+1

Perché è meno leggibile? Ti riferisci alla parte della proprietà automatica del fatto che non è stato definito alcun campo? Ad ogni modo, un buon sviluppatore per quale proprietà viene usata? –

3

Non proprio uno svantaggio, ma è necessario conoscere i valori predefiniti delle proprietà automatiche. Con le proprietà "classiche" abbiamo sempre utilizzato per inizializzare i campi di supporto, ad es. In questo modo:

private bool _flag = true; 
public bool Flag 
{ 
    get { return _flag; } 
    set { _flag = value; } 
} 

Ciò ha reso evidente quale sia il valore predefinito della proprietà.

Con le proprietà automatiche, è necessario sapere quali sono i valori predefiniti per i diversi tipi (ad esempio false per bool). Se non si desidera che la proprietà di avere il valore di default è necessario inizializzare nel costruttore:

class MyClass 
{ 
    public bool Flag { get; set; } 
    public MyClass() 
    { 
    Flag = true; 
    } 
} 

Ciò significa, si necessario implementare un costruttore se si desidera inizializzare le proprietà a non predefinito valori o se una proprietà è di un tipo di riferimento (classe).

Ma come ho scritto, non penso davvero che questo sia uno svantaggio, solo qualcosa che devi sapere.

Problemi correlati