interno vs pubblico in c #


92

Voglio conoscere la differenza tra i modificatori di visibilità publice internal.

Quando dovremmo usare internalin una classe e quando public? Sono confuso con quando un metodo dovrebbe essere publico internal.

Ho letto che è internalpossibile accedervi tramite l'assembly, mentre publicpuò essere utilizzato anche tramite l'assembly in cui risiede la differenza.

Risposte:


101

public è visibile ovunque.

internal è visibile solo all'interno di un assieme

Tendi a usare interno solo per proteggere le API interne. Ad esempio, potresti esporre diversi overload di un metodo:

public int Add(int x, int y)
public int Add(int x,int y, int z)

Entrambi chiamano il metodo interno

internal int Add(int[] numbers)

È quindi possibile applicare molta raffinatezza a un metodo, ma "proteggerlo" utilizzando metodi di facciata che possono aiutare il programmatore a chiamare correttamente il metodo. (Il metodo di implementazione con il parametro array può avere un limite arbitrario di valori, ad esempio.)

Vale anche la pena notare che usando Reflection, tutti i metodi sono richiamabili indipendentemente dalla loro visibilità. Un altro "hack" per controllare / ottenere l'accesso alle API nascoste internamente.


5
in una classe interna posso dichiarare i metodi pubblici ..?
NoviceToDotNet

No, poiché ciò causerebbe un conflitto. Il compilatore ti dirà di questo e non riuscirà a compilare.
Programma X

14
@ Program.X: In realtà, puoi e il compilatore non ti dice nulla.
OR Mapper

In realtà sono venuto qui cercando su Google se questa è effettivamente una funzionalità. Immagina di creare la classe internale tutti i metodi public. Se hai bisogno di una maggiore visibilità, puoi impostare publicnuovamente l'intera classe su . Ma non sono sicuro se debba o meno essere usato in questo modo. Quindi continuo a googling ... Edit Et voilà, stesso argomento: stackoverflow.com/questions/9302236/...
ecth

31

internalè utile quando si desidera dichiarare un membro o un tipo all'interno di una DLL, non al di fuori di quella ...
normalmente, quando si dichiara un membro poiché Publicè possibile accedervi da altre DLL. ma, se hai bisogno di dichiarare qualcosa come pubblico all'interno della tua libreria di classi, puoi dichiararlo come Internal.
in definizione formale: i membri interni sono visibili solo all'interno dell'assemblea corrente ...


11

internalè utile anche durante la scrittura di unit test. L' InternalsVisibleToattributo consente all'assembly di test di accedere ai metodi interni nell'assembly di codice. Cioè puoi testare metodi che sembrano privati ​​al mondo esterno senza usare la riflessione.


6

È possibile accedere al pubblico anche all'esterno dell'assembly. Quindi, quando si ha una classe a cui non si dovrebbe accedere, ogni classe nell'assembly dovrebbe essere in grado di accedervi, allora internal è la cosa giusta. Se hai bisogno di un accesso esterno, usa public.


4

Inoltre, le proprietà contrassegnate come internalgenereranno un BindingExpression path errorse usato per DataBinding in WPF. Quindi quelli devono essere publicper funzionare correttamente, anche quando il DataBinding avviene all'interno dello stesso assembly.


-3

Se puoi fare riferimento all'assembly dall'esterno, hai l'ambito delle classi interne e pubbliche

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.