c# - son - Miembros públicos e internos en una clase interna?
public private protected c# (5)
Ok, entonces esta puede ser una pregunta un poco tonta, y ciertamente hay una respuesta obvia, pero tenía curiosidad si había olvidado alguna sutileza aquí.
¿Hay alguna diferencia en términos de visibilidad / usabilidad entre un miembro public
declarado en una clase internal
y un miembro internal
declarado en una clase internal
?
es decir, entre
internal class Foo
{
public void Bar()
{
}
}
y
internal class Foo
{
internal void Bar()
{
}
}
Si declaró el método como public
y también virtual
, y luego lo anuló en una clase derivada que es public
, la razón para usar este modificador es clara. Sin embargo, ¿es esta la única situación ... me estoy perdiendo algo más?
Acabo de enfrentar otro ejemplo donde hay diferencia entre esos dos, cuando se usa desde XAML en WPF.
XAML:
<Button Tag="{x:Static vm:Foo+Bar.e1}" />
Código con compilaciones enum internal
con éxito:
internal class Foo
{
internal enum Bar
{
e1,
e2,
}
}
Pero sorprendentemente cambiarlo a resultados public
en error:
internal class Foo
{
public enum Bar
{
e1,
e2,
}
}
El último ejemplo produce un error de compilación:
error MC3064: solo las clases públicas o internas pueden usarse dentro del marcado. El tipo ''Bar'' no es público o interno.
Lamentablemente, no puedo explicar qué pasa con el public
en este caso. Mi suposición es "solo porque WPF funciona de esa manera". Simplemente cambie el modificador de la clase anidada a internal
para deshacerse del error.
Considera este caso:
public interface IBar { void Bar(); }
internal class C : IBar
{
public void Bar() { }
}
Aquí C.Bar no se puede marcar como interno; hacerlo es un error porque C.Bar puede ser accedido por un llamante de D.GetBar ():
public class D
{
public static IBar GetBar() { return new C(); }
}
Si se trata de reflexión, importa si el miembro es público o no:
Por ejemplo, incluso podría pasar una clase privada anidada a un enlace WPF y el enlace funcionaría contra las propiedades públicas como siempre.
Un miembro public
sigue siendo internal
cuando está en una clase internal
.
La accesibilidad de un miembro nunca puede ser mayor que la accesibilidad de su tipo contenedor. Por ejemplo, un método público declarado en un tipo interno tiene solo accesibilidad interna
Piénselo de esta manera, accedería a una propiedad public
en ...? Una clase que no puedo ver? :)
La respuesta de Eric es muy importante en este caso, si se expone a través de una interfaz y no directamente, hace la diferencia, simplemente depende si estás en esa situación con el miembro con el que estás tratando.
public
miembros public
de una clase internal
pueden anular a public
miembros public
de public
clases de base public
y, por lo tanto, estar un poco más expuestos ... si indirectamente.