2011-02-01 15 views
6

Mi chiedo semplicemente ...C'è qualche ragione per non usare le proprietà 'protette'?

Esistono motivi per non utilizzare le proprietà protette?

intendo invece di utilizzare questo:

public abstract class Foo 
{ 
    protected Bar { get; private set; } 
} 

per utilizzare questo:

public abstract class Foo 
{ 
    private Bar _bar; 

    protected Foo(Bar bar) 
    { 
     _bar = bar; 
    } 

    protected GetBar() 
    { 
     return _bar; 
    } 
} 
+7

Il secondo è perfettamente valido Java; quindi se vedi un codice C# così, la ragione più probabile è che sia stato scritto da un programmatore Java che non ha ancora adattato a C# ancora. –

+2

Si utilizza 'protected' per l'accessibilità, non ha nulla con le proprietà. – leppie

risposta

9

non vedo alcuna ragione per cui si usa un metodo al posto di una proprietà GetXXX() indipendentemente è modificatori.

Poiché hai taggato questa domanda con il tag C#, raccomando rigorosamente di utilizzare il primo approccio. Ecco a cosa servono le proprietà.

Utilizzare un metodo solo quando il valore restituito da esso può essere diverso ogni volta che viene chiamato indipendentemente dal suo stato. Ad esempio, DateTime.Now è stato un errore e avrebbe dovuto essere un metodo.

Per ulteriori dettagli, fare riferimento alla Proprietà Usage Guidelines on MSDN. In una nota a margine, è sorprendente come non abbiano avuto bisogno di cambiarlo dal Framework 1.1.

+1

Come menzionato sopra da ammoQ, questo è probabilmente il codice portato da Java o il lavoro di un programmatore Java - questo è lo standard in Java. –

+0

Non è richiesto che una proprietà debba essere idempotente. Dovrebbe essere solo "puro" senza effetti collaterali. – leppie

+0

@leppie: Se si osservano le linee guida, ce n'è una in lista quando devono essere usati i metodi che dicono "Chiamare il membro due volte in successione produce risultati diversi". Ovviamente, si parla anche di non avere effetti collaterali. – decyclone

0

Solo se si dispone di attributi non scrivibili o non leggibili all'interno della classe

+0

Per favore, la tua risposta non è chiara. – leppie

1

Ancora pochi motivi per utilizzare le proprietà invece di metodi: rilegatura

  • dati possono vedere solo le proprietà
  • È può usare solo leggere o scrivere solo semantica.
0

La domanda non è veramente su protected ha più con: perché dovrei usare le proprietà?

Propeties sono logicamente equivalenti con Getter metodo coppie/Setter, qualunque cosa si può fare con un con un Name {get{} \ set{}} si può fare con un GetName() \ SetName() coppia e viceversa, tanto più che C# ha getter e setter di accesso, in modo che possiamo giocare con il accessibilità anche.

Tuttavia, ci sono alcune persone che ritengono che le proprietà pubbliche (o protette) sono un po 'come barare da una prospettiva OOP, specialmente se tutto ciò che la proprietà fa è solo esporre un campo di supporto. Dopotutto lo person.Name = "SWeko" sembra che cambi lo stato dell'oggetto esternamente, mentre person.SetName("SWeko") dice semplicemente all'oggetto che ha bisogno di cambiare il suo stato. E da un punto di vista puramente teorico penso che quelle obiezioni abbiano un merito.

Tuttavia, non tutti noi abbiamo il lusso di vivere in torri d'avorio, quindi il concetto di proprietà è davvero utile, in quanto è più leggibile, meno soggetto a errori, e IMHO, più vicino al modello del mondo reale. Essa ci fornisce anche una sorta di dicotomia, quando scrivo qualcosa di simile:

person.Name = "SWeko"; 
person.Work(); 

mi aspetto che la prima linea sarà un compito veloce, e non avrà effetti collaterali, mentre mi aspetto che la seconda linea farà qualcosa di più e probabilmente influenzerà lo stato interiore dell'oggetto.Quando utilizzo il metodo Getter e Setter, nessuna distorsione del genere è immediatamente evidente:

person.SetName("SWeko"); 
person.Work(); 
+0

IMHO, le proprietà di lettura-scrittura dovrebbero comportarsi come variabili. Se un oggetto implementa alcune proprietà di lettura-scrittura, scriverle e quindi leggerle in qualsiasi ordine senza chiamate di metodo * intermedie * dovrebbe indurli a rileggere i valori scritti. Non ho alcun problema con le proprietà scrivibili che cambiano i valori delle proprietà di sola lettura, o con le chiamate al metodo che cambiano i valori di una o tutte le proprietà (sola lettura o lettura-scrittura), ma non mi piace lettura-scrittura inter-connessa lettura-scrittura proprietà. IMHO, qualcosa come StringBuilder.Length dovrebbe essere una proprietà di sola lettura, abbinata a un metodo SetLength. – supercat

+0

@supercat Questo diventerebbe molto noioso con i controlli dell'interfaccia utente, poiché tendono ad avere molte e molte proprietà che dipendono l'una dall'altra in un modo previsto e logico (ad esempio, AutoSize influenza le proprietà di larghezza e altezza). – SWeko

+0

@SWeko: Un paradigma che ritengo che manchi da parti di Forms e che possa contribuire a migliorarne l'utilità, è la separazione delle proprietà "settings" dal "comportamento corrente". Ad esempio, "Visibile" deve essere suddiviso in "Richiedibilità" e "IsShown". "RequestedVisibility" dovrebbe essere una proprietà read-write che restituirebbe sempre il valore scritto; "IsShown" dovrebbe essere una proprietà di sola lettura che indica se il controllo e tutti i suoi genitori hanno impostato RequestedVisibility. Per il dimensionamento, dovrebbero esserci proprietà di dimensione richiesta e dimensione effettiva, la prima lettura-scrittura l'ultima di sola lettura. – supercat

Problemi correlati