Domanda

Considerando " privato " è il modificatore di accesso predefinito per i membri della classe, perché è necessaria anche la parola chiave?

È stato utile?

Soluzione

È per te (e per i futuri manutentori), non per il compilatore.

Altri suggerimenti

C'è una certa disinformazione qui:

  

" Il modificatore di accesso predefinito non è privato ma interno "

Beh, dipende da cosa stai parlando. Per i membri di un tipo, è privato. Per gli stessi tipi di livello superiore, è interno.

  

" Privato è solo il valore predefinito per metodi su un tipo "

No, è l'impostazione predefinita per tutti i membri di un tipo: proprietà, eventi, campi, operatori, costruttori, metodi, tipi nidificati e qualsiasi altra cosa che ho dimenticato.

  

" In realtà, se la classe o la struttura non sono dichiarate con un modificatore di accesso, l'impostazione predefinita è "

Solo per tipi di livello superiore. Per i tipi nidificati, è privato.

Oltre a limitare l'accesso alla proprietà per una parte ma non per l'altra, il valore predefinito è praticamente sempre "più restrittivo possibile". "

Personalmente, non so se essere esplicito. Il "pro" perché l'uso del default è che evidenzia ovunque che stai rendendo qualcosa di più visibile del livello più restrittivo. Il "pro" per aver specificato esplicitamente è che è più ovvio per coloro che non conoscono la regola di cui sopra e mostra che ci hai pensato un po '.

Eric Lippert segue la forma esplicita e anch'io sto iniziando a piegarmi in quel modo.

Vedi http://csharpindepth.com/ViewNote.aspx?NoteID=54 per un po 'di più su questo.

esplicitezza. Non utilizzo mai il valore predefinito e aggiungo sempre esplicitamente il modificatore.

Ciò potrebbe essere dovuto al mio background Java in cui l'impostazione predefinita era "pacchetto" (approssimativamente equivalente a "interno" in C #) e quindi la differenza mi ha sempre infastidito. Ho trovato preferibile l'esplicita.

Adesso uso anche ReSharper che per impostazione predefinita è esplicito, quindi conferma e rafforza solo il mio pregiudizio :)

Il modificatore privato spiega l'intento.

Una variabile membro privata non è destinata alla manipolazione diretta al di fuori della classe. get / set accessors può o non può essere creato per la variabile.

Un metodo privato non è destinato all'uso al di fuori della classe. Questo può essere solo per funzionalità interna. Oppure potresti rendere privato un costruttore predefinito per impedire la costruzione della classe senza passare valori.

Il modificatore privato (e altri simili) può essere un modo utile di scrivere codice auto-documentante.

Come sottolineato da Jon Skeet nel suo libro C # Approfondimento , c'è un posto in C # dove la parola chiave privata è richiesta per ottenere un effetto.

Se la mia memoria funziona correttamente, la parola chiave privata è l'unico modo per creare un getter o setter di proprietà con ambito privato, quando il suo contrario ha un'accessibilità maggiore rispetto a quella privata. Esempio:

public bool CanAccessTheMissileCodes
{
    get { return canAccessTheMissileCodes; }
    private set { canAccessTheMissileCodes = value; }
}

La parola chiave privata è richiesta per raggiungere questo obiettivo, perché un modificatore di accessibilità delle proprietà aggiuntivo può solo restringere l'ambito, non allargarlo. (Altrimenti, si sarebbe potuto creare una proprietà privata (per impostazione predefinita) e quindi aggiungere un modificatore pubblico.)

Privato è solo il valore predefinito per metodi su un tipo, ma il modificatore privato viene utilizzato altrove.

Da C # Language Specification 3.0 (msdn) Sezione 3.5. 1

  

A seconda del contesto in cui si svolge la dichiarazione di un membro, sono consentiti solo alcuni tipi di accessibilità dichiarata. Inoltre, quando una dichiarazione del membro non include alcun modificatore di accesso, il contesto in cui ha luogo la dichiarazione determina l'accessibilità dichiarata predefinita.

     
      
  • Gli spazi dei nomi implicitamente hanno un'accessibilità dichiarata pubblica. Non sono consentiti modificatori di accesso nelle dichiarazioni dello spazio dei nomi.
  •   
  • I tipi dichiarati in unità di compilazione o spazi dei nomi possono avere accessibilità e default dichiarati pubblici o interni   all'accessibilità dichiarata interna.
  •   
  • I membri della classe possono avere uno dei cinque tipi di accessibilità dichiarata e l'impostazione predefinita è l'accessibilità dichiarata privata. (Si noti che un tipo dichiarato come membro di una classe può avere uno dei cinque tipi di accessibilità dichiarata, mentre un tipo dichiarato come membro di uno spazio dei nomi può avere solo accessibilità dichiarata pubblica o interna.)
  •   
  • I membri di Struct possono avere accessibilità dichiarata pubblica, interna o privata e impostazione predefinita per l'accessibilità dichiarata privata poiché le strutture sono implicitamente sigillate. I membri Struct introdotti in una struttura (ovvero non ereditata da quella struttura) non possono avere un'accessibilità dichiarata interna protetta o protetta. (Si noti che un tipo dichiarato come membro di una struttura può avere accessibilità dichiarata pubblica, interna o privata, mentre un tipo dichiarato come membro di uno spazio dei nomi può avere solo accessibilità dichiarata pubblica o interna.)
  •   
  • I membri dell'interfaccia implicitamente hanno un'accessibilità dichiarata pubblica. Non sono consentiti modificatori di accesso nelle dichiarazioni dei membri dell'interfaccia.
  •   
  • I membri dell'enumerazione implicitamente hanno un'accessibilità dichiarata pubblica. Non sono consentiti modificatori di accesso nelle dichiarazioni dei membri di enumerazione.
  •   

Per completezza. E alcune persone in realtà preferiscono essere esplicite nel loro codice sui modificatori di accesso sui loro metodi.

Per simmetria e conformità con gli stili di codifica a cui piace che tutto sia esplicito (personalmente mi piace ...)

L'uso di private segnala esplicitamente la tua intenzione e lascia indizi per gli altri che supporteranno il tuo codice;)

Alcuni stili di codifica raccomandano di inserire tutto il " pubblico " prima gli elementi, seguito dal "privato" elementi. Senza un " privato " parola chiave, non puoi farlo in questo modo.

Aggiornamento: non ho notato il messaggio " c # " tag su questo quindi la mia risposta si applica più a C ++ che a C #.

Di solito lascio fuori il privato ma lo trovo utile per allineare il codice:

private   int    x;
public    string y;
protected float  z;

VS:

int x;

public    string y;
protected float  z;

Come Robert Paulson ha detto nella sua risposta, il privato non viene utilizzato solo sui membri, ma anche sui tipi . Ciò diventa importante perché l'impostazione predefinita per i tipi è internal che può fuoriuscire involontariamente se si utilizza InternalsVisibleToAttribute .

In realtà, se la classe o la struttura non sono dichiarate con un modificatore di accesso, il loro valore predefinito è interno.

Quindi, se vuoi renderlo privato, usa privato.

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