Visibilità predefinita per classi e membri C # (campi, metodi, ecc.)?


164

Sto cercando di trovare un riferimento per la visibilità predefinita di vari aspetti di C #. Tipi di classe, campi, metodi, enum, ecc.

Qualcuno può fornire un elenco di questi insieme alla loro visibilità predefinita (cioè, nessun modificatore con prefisso)?



8
Non lo considero un duplicato ... la domanda è specifica (qual è il valore predefinito per QUESTO?), Questo è ampio (quali sono TUTTI i valori predefiniti?)
WernerCD

Risposte:


266

Tutte le informazioni che stai cercando possono essere trovate qui e qui (grazie a Reed Copsey ):

Dal primo link:

Le classi e le strutture dichiarate direttamente all'interno di uno spazio dei nomi (in altre parole, che non sono nidificate all'interno di altre classi o strutture) possono essere pubbliche o interne. Interno è l'impostazione predefinita se non viene specificato alcun modificatore di accesso .

...

Il livello di accesso per i membri della classe e membri della struttura , comprese le classi e le strutture nidificate, è privato per impostazione predefinita .

...

interfacce predefinite per l' accesso interno .

...

I delegati si comportano come classi e strutture. Per impostazione predefinita, hanno accesso interno quando dichiarato direttamente all'interno di uno spazio dei nomi e accesso privato quando nidificato .


Dal secondo link:

I tipi di livello superiore , che non sono nidificati in altri tipi, possono avere solo accessibilità interna o pubblica. L' accessibilità predefinita per questi tipi è interna .

E per i tipi nidificati:

Membri dell'accessibilità dei membri predefiniti
---------- ----------------------------
enum public
classe privata
interfaccia pubblica
struct privato

6
Una bella raccolta dalle informazioni di Reed, ma hai dimenticato di specificare che tali modificatori di accesso si applicano anche ai metodi.
Gioele,

4
@Joel Che vuoi dire? Dichiara chiaramente "membri". I membri sono dati e comportamento e quindi inclusivi di metodi.
rism

Nel caso in cui qualche sviluppatore di vb.net lo stia guardando, vb è diverso. L'ambito predefinito per i membri della classe vb è Public. Enumi membri lo sono anche Public. Probabilmente meno confuso usare solo l'ambito esplicito nel tuo caso poiché le probabilità sono alte che verrà tradotto o letto dagli sviluppatori c # ad un certo punto. La generazione del codice in vb.net non fa questo per te, sfortunatamente.
toddmo

Aggiungerò che un'interfaccia nidificata all'interno di una classe è privata, non interna, per impostazione predefinita.
Frank Bryce il

13

Da MSDN:

I tipi di livello superiore , che non sono nidificati in altri tipi, possono solo avere internalo publicaccessibilità. L'accessibilità predefinita per questi tipi è internal.


I tipi nidificati , che sono membri di altri tipi, possono avere accessibilità dichiarate come indicato nella tabella seguente.

Accessibilità ai membri nidificati predefiniti e modificatori di accessibilità consentiti

Fonte: livelli di accessibilità (Riferimenti per C #) (6 dicembre ° , 2017)


9

Per impostazione predefinita, il modificatore di accesso per una classe è internal. Ciò significa che una classe è accessibile all'interno dello stesso assembly. Ma se vogliamo che la classe sia accessibile da altri assembly, allora deve essere resa pubblica.


19
Questa informazione era già presente nelle altre risposte. Dovresti rispondere a una domanda, in particolare una vecchia come questa, quando hai ulteriori informazioni da fornire o pensi che le altre risposte siano sbagliate. Comunque, benvenuto in Stack Overflow.
Gorpik,

Non è necessario che una classe sia resa pubblica per essere accessibile ad altre assemblee. Si potrebbe usare la classe InternalsVisibleToAttribute[assembly:InternalsVisibleTo("Friend1b")]
adam

0

Di default è private. A meno che non siano nidificati, le classi lo sono internal.


1
le enumerazioni non sono pubbliche per impostazione predefinita?
Ryan Peters,

4
@Jay: a meno che non siano nidificati. @Ryan: No, gli enum non nidificati sono interni per impostazione predefinita.
Jon Skeet,

2
@Ryan: i membri Enum sono pubblici per impostazione predefinita, ma l'enum stesso è interno.
Reed Copsey,

@ReedCopsey Ma il libro da cui sto imparando lo dice chiaramente enum members are private by default, so to use them outside the enum we should declare them as public. Puoi spiegare perché il libro è in contraddizione con quello che dici? Grazie.

Qualunque sia la lettura di book @ user5794376 (chiaramente un account eliminato) dovrebbe essere data a tutte le recensioni da 1 stella se ciò che dicono nel libro è vero. Basta guardare Microsoft Docs per sapere che i membri di enum sono pubblici per impostazione predefinita ed è per questo che è prassi comune per gli enum solo non essere espliciti su di essi.
Rodney S. Foley,
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.