interno vs público en c #

92

Quiero saber la diferencia entre los modificadores de visibilidad publicy internal.

¿Cuándo debemos usarlo internalen una clase y cuándo public? Estoy confundido con cuándo un método debería ser publico internal.

He leído que internalse puede acceder a través de la Asamblea, mientras publicque también se puede utilizar a través de la Asamblea donde radica la diferencia.

NoviceToDotNet
fuente

Respuestas:

101

public es visible desde cualquier lugar.

internal es visible solo dentro de un ensamblaje

Suele utilizar internal solo para proteger las API internas. Por ejemplo, puede exponer varias sobrecargas de un método:

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

Ambos llaman al método interno

internal int Add(int[] numbers)

Entonces puede poner mucha sofisticación en un método, pero "protegerlo" usando métodos de fachada que pueden ayudar al programador a llamar al método correctamente. (El método de implementación con el parámetro de matriz puede tener un límite arbitrario de valores, por ejemplo).

También vale la pena señalar que al usar Reflection, todos y cada uno de los métodos son invocables independientemente de su visibilidad. Otro "truco" para controlar / obtener acceso a API ocultas internamente.

Programa.X
fuente
5
en una clase interna puedo declarar los métodos públicos ...?
NoviceToDotNet
No, ya que esto causaría un conflicto. El compilador le informará de esto y no podrá compilar.
Programa.X
14
@ Program.X: En realidad, puede y el compilador no le dice nada.
OR Mapper
En realidad, vine aquí buscando en Google si se trata de una característica o no. Imagina hacer la clase internaly todos los métodos public. Si necesita una mayor visibilidad, puede configurar toda la clase de publicnuevo. Pero no estoy seguro de si debe usarse de esta manera o no. Así que sigo buscando en Google ... editar Et voilà, mismo tema: stackoverflow.com/questions/9302236/…
ecth
31

internales útil cuando desea declarar un miembro o escribir dentro de una DLL, no fuera de eso ...
normalmente, cuando declara un miembro, ya Publicque puede acceder a eso desde otras DLL. pero, si necesita declarar algo público dentro de su biblioteca de clases, puede declararlo como Internal.
en defensa formal: los miembros internos son visibles justo dentro de la asamblea actual ...

Dr. TJ
fuente
11

internaltambién es útil al escribir pruebas unitarias. El InternalsVisibleToatributo permite que su ensamblado de prueba acceda a métodos internos en su ensamblaje de código. Es decir, puede probar métodos que parecen privados para el mundo exterior sin utilizar la reflexión.

Brian Rasmussen
fuente
6

También se puede acceder al público fuera de la asamblea. Entonces, cuando tiene una clase a la que no se debe acceder, todas las clases en el ensamblado deben poder acceder a ella, entonces interno es lo correcto. Si necesita acceso externo, use public.

Tomas Jansson
fuente
4

Además, las propiedades marcadas como internalarrojarán un BindingExpression path errorsi se usan para DataBinding en WPF. Por lo tanto, deben ser publicpara que funcionen correctamente, incluso cuando el enlace de datos se lleva a cabo dentro del mismo ensamblado.

M463
fuente
-3

Si puede hacer referencia al ensamblaje desde fuera, tiene alcance de clases internas y públicas

Leroy.P
fuente