J'ai une petite question; si je déclare une classe privée dans un espace de noms au sein d'un assembly par rapport à la classe interne, je peux accéder à cette classe dans l'assembly dans les deux cas, alors quelle est la différence entre une classe privée et une classe interne? ou des modificateurs privés et internes en termes de classes sont-ils utilisés lors de l'imbrication de la classe dans la classe?
Mayotic
2
J'ai ajouté le projet / assemblage spécifique comme référence d'un autre projet et les deux privés et internes m'empêchent d'accéder à cette classe particulière dans l'espace de noms, alors là encore ... la différence entre les classes privées et internes est? merci
mayotic
9
Vous ne pouvez pas déclarer une classe de niveau supérieur comme privée. Le compilateur vous arrêtera.
TheGateKeeper
6
@NetSkay: Si vous déclarez une classe privée à l'intérieur d'une classe publique, cette classe n'est pas accessible par les autres classes de votre assembly, mais si vous déclarez cette classe comme interne, elle sera accessible dans l'assembly. Cependant, ils ne seront pas accessibles tous les deux en dehors de l'assemblage.
Yogesh Jindal
2
Si vous venez d'un arrière-plan VB.NET, le mot clé "interne" de C # est équivalent au mot clé "Friend" de VB.NET.
Intéressant qui Protected Internaloffre un accès plus large que Protected.
Dan Bechard
9
@Dan, entièrement d'accord. Il pourrait être utile de lire et de penser protected internalà protected OR internal.
chessofnerd
7
Que veut With Typedire?
James Wierzba
@Dan ouais, j'ai supposé que cela agirait simplement comme une table de vérité et ANDque la matrice pour true | false | false | false pour protected internal. pas intuitif. à la place, c'est vrai | vrai | vrai | faux comme si OR'd.
ferr
1
Soit dit en passant, C # 7.2 vient d'ajouter un modificateur «protégé ET interne», bien que les mots clés réels choisis private protectedne soient pas très intuitifs. Pour plus de détails: docs.microsoft.com/en-us/dotnet/csharp/language-reference/…
Joe Sewell
70
internalles membres sont visibles pour tout le code de l'assembly dans lequel ils sont déclarés.
(Et pour les autres assemblys référencés à l'aide de l' [InternalsVisibleTo]attribut )
privateles membres ne sont visibles que par la classe déclarante. (y compris les classes imbriquées)
Une classe externe (non imbriquée) ne peut pas être déclarée private, car il n'y a pas d'étendue contenant pour la rendre privée.
Pour répondre à la question que vous avez oublié de poser, les protectedmembres sont comme des privatemembres, mais sont également visibles dans toutes les classes qui héritent du type déclarant. (Mais uniquement sur une expression d'au moins le type de la classe actuelle)
alors quelle est la différence dans l'utilisation de cela? je ne comprends toujours pas: X
deadfish
4
Private est accessible depuis l'intérieur de la classe uniquement, Internal est accessible depuis l'intérieur de l'assembly (projet en VS ie fichier dll / exe).
Jesper Fyhr Knudsen
3
Interne vous permettra de référencer, par exemple, une classe statique d'accès aux données (pour la sécurité des threads) entre plusieurs classes de logique métier, sans les abonner pour hériter de cette classe / du voyage les unes sur les autres dans les pools de connexions, et pour éviter au final d'autoriser une classe DAL promouvoir l'accès au niveau public. Cela a d'innombrables soutiens dans la conception et les meilleures pratiques.
Entity Framework fait bon usage de ce type d'accès
les membres internes sont accessibles au sein de l'assembly (uniquement accessible dans le même projet)
les membres privés sont accessibles dans la même classe
Exemple pour les débutants
Il y a 2 projets dans une solution (Project1, Project2) et Project1 a une référence à Project2.
La méthode publique écrite dans Project2 sera accessible dans Project2 et Project1
La méthode interne écrite dans Project2 sera accessible uniquement dans Project2 mais pas dans Project1
La méthode privée écrite dans la classe 1 de Project2 ne sera accessible qu'à la même classe. Il ne sera ni accessible dans les autres classes du projet 2 pas dans le projet 1.
Réponses:
interne est pour la portée de l'assembly (c'est-à-dire accessible uniquement à partir du code dans le même .exe ou .dll)
private est pour la portée de la classe (c'est-à-dire accessible uniquement à partir du code de la même classe).
la source
Trouvez une explication ci-dessous. Vous pouvez consulter ce lien pour plus de détails - http://www.dotnetbull.com/2013/10/public-protected-private-internal-access-modifier-in-c.html
Privé: - Les membres privés ne sont accessibles que dans le propre type (classe propre).
Interne: - Les membres internes sont accessibles uniquement au sein de l'assembly par héritage (son type dérivé) ou par instance de classe.
Référence :
dotnetbull - qu'est-ce qu'un modificateur d'accès en c #
la source
Protected Internal
offre un accès plus large queProtected
.protected internal
àprotected OR internal
.With Type
dire?AND
que la matrice pour true | false | false | false pourprotected internal
. pas intuitif. à la place, c'est vrai | vrai | vrai | faux comme siOR'd
.private protected
ne soient pas très intuitifs. Pour plus de détails: docs.microsoft.com/en-us/dotnet/csharp/language-reference/…internal
les membres sont visibles pour tout le code de l'assembly dans lequel ils sont déclarés.(Et pour les autres assemblys référencés à l'aide de l'
[InternalsVisibleTo]
attribut )private
les membres ne sont visibles que par la classe déclarante. (y compris les classes imbriquées)Une classe externe (non imbriquée) ne peut pas être déclarée
private
, car il n'y a pas d'étendue contenant pour la rendre privée.Pour répondre à la question que vous avez oublié de poser, les
protected
membres sont comme desprivate
membres, mais sont également visibles dans toutes les classes qui héritent du type déclarant. (Mais uniquement sur une expression d'au moins le type de la classe actuelle)la source
private - encapsulations dans class / scope / struct ect '.
interne - encapsulation dans les assemblages.
la source
Les membres privés ne sont accessibles que dans le corps de la classe ou la structure dans laquelle ils sont déclarés.
Les types ou membres internes sont accessibles uniquement dans les fichiers du même assembly
la source
Interne vous permettra de référencer, par exemple, une classe statique d'accès aux données (pour la sécurité des threads) entre plusieurs classes de logique métier, sans les abonner pour hériter de cette classe / du voyage les unes sur les autres dans les pools de connexions, et pour éviter au final d'autoriser une classe DAL promouvoir l'accès au niveau public. Cela a d'innombrables soutiens dans la conception et les meilleures pratiques.
Entity Framework fait bon usage de ce type d'accès
la source
les membres internes sont accessibles au sein de l'assembly (uniquement accessible dans le même projet)
les membres privés sont accessibles dans la même classe
Exemple pour les débutants
Il y a 2 projets dans une solution (Project1, Project2) et Project1 a une référence à Project2.
la source