Qualche motivo per scrivere la parola chiave "private" in C #?


109

Per quanto ne so, privateè l'impostazione predefinita ovunque in C # (il che significa che se non scrivo public, protected, internal, ecc sarà privateper impostazione predefinita). (Perfavore, correggimi se sbaglio.)

Allora, qual è il motivo per scrivere quella parola chiave o perché esiste anche per i membri?

Ad esempio, quando un gestore di eventi viene generato automaticamente, ha questo aspetto:

private void RatTrap_MouseEnter(object sender, CheeseEventArgs e)
{

}

Ma perché scrive anche privato se è implicito e predefinito? Solo così che gli sviluppatori inesperti (che non sanno che è l'impostazione predefinita di C #) sanno che è privato? O c'è una differenza per il compilatore?

Inoltre, c'è un caso in cui la scrittura "privato" (da sola) si cambia l'accessibilità degli Stati?


18
IIRC, tuttavia, sarà un tipo "di primo livello" internalper impostazione predefinita.
Jeff Mercado

4
L'impostazione predefinita per tutto non è privato, come indicato, e come regola generale è meglio essere espliciti.
James Michael Hare


L'impostazione predefinita per tutto è "il più privato possibile". Ovviamente una classe non annidata non può essere privata, o niente potrebbe istanziarla o usarla. Ma i membri sono privati ​​per impostazione predefinita e le classi nidificate sono private per impostazione predefinita. Tutto in C # ha, per impostazione predefinita, il livello di visibilità più limitato che può avere.
Ryan Lundy

Risposte:


171

AFAIK, private è l'impostazione predefinita ovunque in C # (il che significa che se non scrivo public, protected, internal, ecc. Sarà privato per impostazione predefinita). (per favore correggimi se sbagliato).

Questo non è vero. I tipi definiti all'interno di uno spazio dei nomi (classi, strutture, interfacce, ecc.) Saranno interni per impostazione predefinita. Inoltre, i membri all'interno di tipi diversi hanno accessibilità predefiniti differenti (come public per i membri dell'interfaccia). Per i dettagli, vedere Livelli di accessibilità su MSDN.

Anche,

Allora, qual è il motivo per scrivere quella parola chiave, o perché esiste?

Specificare questo in modo esplicito aiuta a denotare la tua intenzione di rendere il tipo privato, in modo molto esplicito. Questo aiuta con la manutenibilità del codice nel tempo. Questo può aiutare con altri sviluppatori (o te stesso) a sapere se un membro è privato per impostazione predefinita o apposta, ecc.


1
@ Wayne: ha una risposta con un punteggio più alto di Jon Skeet ma non se lo merita ... La risposta di Jon è molto più precisa.
aleroot

2
Questa è una distinzione inutile. I tipi all'interno di uno spazio dei nomi sono interni per impostazione predefinita perché non possono essere privati ​​per impostazione predefinita; altrimenti niente potrebbe usarli. Sono ancora limitati come possono essere, per impostazione predefinita.
Ryan Lundy,

1
L'accessibilità dei membri predefinita per le classi inisde e la struttura è privata. Controlla qui: msdn.microsoft.com/en-us/library/ba0a1yw2(v=vs.90).aspx
Mitja Bonca

Ma gli elementi all'interno di uno spazio dei nomi non possono essere private.
Shimmy Weitzhandler

Inoltre, gete come setimpostazione predefinita l'accessibilità della proprietà stessa
AustinWBryan

119

Per quanto ne so, privato è l'impostazione predefinita ovunque in C #

Non proprio: l'impostazione predefinita è "l'accesso più limitato disponibile per questa dichiarazione". Quindi, ad esempio, con un tipo di primo livello il valore predefinito è internal; per un tipo annidato il valore predefinito è private.

Allora, qual è il motivo per scrivere quella parola chiave, o perché esiste?

Lo rende esplicito, il che è positivo per due motivi:

  • Rende più chiaro per coloro che non conoscono le impostazioni predefinite, come da tua domanda (non mi è mai piaciuto questo argomento, personalmente, ma ho pensato che valesse la pena menzionarlo)
  • Dà l'impressione che tu abbia deliberatamente deciso di renderlo privato, piuttosto che semplicemente andare con le impostazioni predefinite.

Per quanto riguarda la tua ultima parte:

Inoltre c'è un caso in cui scrivere "privato" (da solo) cambierà l'accessibilità del membro?

Sì, per rendere la metà di una proprietà più restrittiva dell'altra:

// Public getter, public setter
public int Foo { get; set; }

// Public getter, private setter
public int Bar { get; private set; }

Di solito usavo le impostazioni predefinite ovunque potessi, ma sono stato convinto (in parte da Eric Lippert) che chiarire che ci hai pensato e hai deciso di fare qualcosa di privato sia una buona idea.

Personalmente vorrei che ci fosse un modo per farlo anche per le dichiarazioni di tipo sealed / unsealed - forse non hanno nemmeno un valore predefinito. Sospetto che molti sviluppatori (me compreso se non sto attento) lasciano le classi non sigillate solo perché è meno faticoso che renderle sigillate.


+1. L'uso di parole chiave altrimenti irrilevanti per segnalare l'intento semantico è utile, sebbene il mio background Java faccia l'uso di finalun esempio più tipico.
jprete

1
@minitech: funziona anche il contrario, ma è meno utile. Tutto questo è stato introdotto in C # 2.
Jon Skeet

20
Certamente vorrei che non ci fossero affatto impostazioni predefinite e il compilatore ha semplicemente lanciato un errore se mancava il modificatore di accesso. Non credo che la maggior parte delle persone sappia quali sono le impostazioni predefinite per ogni situazione, il che porta a errori non intenzionali.

+1 "per un tipo annidato il valore predefinito è privato" - Lo so solo quando leggo la tua risposta. Grazie!
Nordin

5
@Phong, per C # c'è una semplice regola: per impostazione predefinita, tutto è il più privato possibile. Gli elementi in uno spazio dei nomi come le classi non annidate non possono essere privati, perché niente potrebbe usarli. Possono essere solo interni o pubblici; quindi, per impostazione predefinita, sono interni. Le cose all'interno di altre cose (enumerazioni all'interno di una classe; classi annidate; proprietà; campi; metodi ...) sono private per impostazione predefinita.
Ryan Lundy,

11

privateaggiunge confusione visiva. A coloro che insistono sul fatto che rende le cose esplicite, chiederei: lo fai anche con la matematica? Per esempio:

var answer = a + b / c;

Lo trovi poco chiaro senza parentesi ridondanti in giro b / c?

La regola in C # è molto semplice: per impostazione predefinita, tutto è il più vicino possibile al privato. Quindi, se hai bisogno che qualcosa sia più visibile di quello predefinito, aggiungi un modificatore. Altrimenti, non aggiungere parole chiave inutili al tuo codice.


1
Ero d'accordo con questo diritto prima di porre la domanda. Ma alcune persone scrivono VB, alcuni C ++, alcuni anche F # (provenienti da altri linguaggi funzionali come Haskell forse?), Meglio di quanto fanno in C #. Quindi, per loro (e per noi se ce ne dimentichiamo dopo 2 anni senza c # ing) è meglio se le funzioni di accesso sono esplicite. Non sottovalutare l'impatto che il facile apprendimento ha su un progetto, molti sviluppatori provengono da background che potrebbero non riflettere lo strumento scelto e hanno bisogno di aiuti per l'apprendimento, anche nel codice di produzione, questo non è affatto male (e sappiamo che molti codice pessimo C #, quindi anche alcuni aiuti ci aiutano).
Camilo Martin

3
Beh, certo, in VB le impostazioni predefinite sono atroci. Penso che la visibilità predefinita sia Friendper i membri, ad esempio. C # fa le sue impostazioni di visibilità nel modo giusto: le cose sono impostate sulla visibilità minima possibile a meno che non vengano modificate. Da quello che sono in grado di trovare, sembra che lo stesso sia vero per C ++ (tranne le strutture). (Non sembra essere vero per F #.)
Ryan Lundy

6
È strano per me che così tante persone siano favorevoli var, perché riduce il disordine visivo, eppure così tante persone sono favorevoli a digitare inutilmente private.
Ryan Lundy,

2
Mi spingerei addirittura a sostenere che il disordine visivo inibisce la leggibilità!
binki

1
upvoted anche se io non preferisco usare parentesi nel caso del vostro esempio matematica.
Marc 2377

7

Per quanto ne so, privato è l'impostazione predefinita ovunque in C #

Dichiarare esplicitamente privato significa che sai che è privato. Non solo pensare che lo sia, perché per quanto ne sai, è l'impostazione predefinita. Significa anche che qualcun altro che guarda il codice sa di cosa si tratta.

Non c'è un "Penso che sia", "Sono abbastanza sicuro che è", ecc E 'solo è . E tutti sono sulla stessa pagina.

Non sono uno sviluppatore C # . Se dovessi lavorare con un codice che non è stato dichiarato esplicitamente privato , probabilmente presumerei che fosse interno .

Non mi piace quando le cose sono impostate in modo implicito. Non è mai così chiaro come quando sono impostati esplicitamente.


Sembra ragionevole, dimentico persino le basi delle lingue che una volta conoscevo meglio.
Camilo Martin

6

Leggibilità: non tutti potrebbero sapere che privato è il comportamento predefinito.

Intento - Fornisce una chiara indicazione che hai dichiarato specificamente la proprietà privata (per qualsiasi motivo).


5

Leggibilità, dimostrazione di intenti sono due ottimi motivi a cui riesco a pensare.


Concordato. Ad esempio, se stai lavorando con altri sviluppatori su un po 'di codice, impostare qualcosa su privato aiuta a indicare il tuo intento. È anche utile quando torni indietro nel tuo codice dopo un certo numero di anni e il tuo IDE può dirti quali metodi dovrebbero essere accessibili pubblicamente per quella classe.
Aaron Newton

3

Una buona ragione per specificare esplicitamente la visibilità è che non devi pensare a quale sia l'impostazione predefinita per il contesto in cui ti trovi.

Un altro buon motivo è perché FxCop ti dice di farlo.


+1, ho appena notato che FxCop si lamentava della mia rimozione del modificatore privato ora che ho creato con la modifica.
Camilo Martin

2

Molte persone (persone come me!) Programmano regolarmente in una manciata di lingue diverse. Essere esplicito con cose come queste mi impedisce di dover ricordare tutti i dettagli arcani di tutti i linguaggi in cui programma.


1
Beh, non direi che "il modificatore di accesso predefinito è private" è un dettaglio arcano ... Ma capisco il punto. L'altro giorno ho avuto problemi a ricordare come funzionava il framework che ho usato la scorsa settimana ( MEF ).
Camilo Martin

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.