una son que programacion privado otra modificadores metodos metodo los desde definicion cuales concepto como clases clase acceso acceder c# class public access-modifiers internal

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 .

Desde MSDN :

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.