90 votes

Membres publics et internes dans une classe interne ?

Ok, c'est peut-être une question un peu stupide, et il y a certainement une réponse évidente, mais je suis curieux de savoir si j'ai manqué des subtilités ici.

Existe-t-il une différence en termes de visibilité/utilisabilité entre une public déclaré dans un internal et une classe internal déclaré dans un internal classe ?

c'est-à-dire entre

internal class Foo
{
    public void Bar()
    {
    }
}

et

internal class Foo
{
    internal void Bar()
    {
    }
}

Si vous avez déclaré la méthode comme public et aussi virtual et l'a ensuite remplacé dans une classe dérivée qui est public la raison de l'utilisation de ce modificateur est claire. Cependant, est-ce la seule situation... est-ce que je rate quelque chose d'autre ?

69voto

Eric Lippert Points 300275

Considérez ce cas :

public interface IBar { void Bar(); }
internal class C : IBar
{
    public void Bar() { }
}

Ici, C.Bar ne peut pas être marqué comme interne ; cela constitue une erreur car C.Bar peut être accessible par un appelant de D.GetBar() :

public class D
{
    public static IBar GetBar() { return new C(); } 
}

54voto

Nick Craver Points 313913

A public est toujours juste internal lorsque dans un internal classe.

De MSDN :

L'accessibilité d'un membre ne peut jamais être supérieure à l'accessibilité de son type contenant. Par exemple, une méthode publique déclarée dans un type interne n'a qu'une accessibilité interne.

Pensez-y de cette façon, j'accéderais à une public propriété on.... ? Une classe que je ne vois pas ? :)

La réponse d'Eric est très importante dans ce cas, si elle est exposée via une interface et non directement elle fait faire une différence, tout dépend si vous êtes dans cette situation avec le membre avec lequel vous traitez.

2voto

public les membres d'une internal peut remplacer la classe public les membres de public classes de base et, par conséquent, être un peu plus exposé... si indirectement.

1voto

springy76 Points 1059

En matière de réflexion, il importe que le membre soit public ou non :

Par exemple, vous pouvez même passer une classe privée imbriquée à une liaison WPF et la liaison fonctionnera avec les propriétés publiques comme d'habitude.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X