2009-08-24 4 views
1

Supposons que nous ayons une classe nommée class1.Existe-t-il une contrainte pour spécifier le spécificateur d'accès des membres d'une classe lorsque nous avons spécifié un spécificateur d'accès de la classe?

La classe 1 a plusieurs propriétés et méthodes et nous avons décidé de spécifier le spécificateur d'accès de class1 comme interne.

Maintenant, pouvons-nous définir le spécificateur d'accès des méthodes class1 comme publiques?

+1

Oui, nous pouvons le faire. Vous pouvez l'essayer vous-même. Je pense que tu veux demander ... pourquoi? Corrigez votre question dans ce cas. –

Répondre

1

Par les règles d'accès aux règles sur les méthodes et les propriétés ne peut pas être plus accessible que celle de la classe qui le contient.

Mais j'ai essayé ceci:

internal class Test 
{ 
    public string Testing{get;set;} 
} 

et il compile sans aucune exception! Je pense que c'est bon comme la classe Le test ne sera pas accessible en dehors de l'espace de noms assemblée nous avons déclaré que la propriété publique ne fera aucune différence.

Cela ne fonctionne pas:

private class Test 
{ 
    public string Testing{get;set;} 
    internal string TestingAgain{get;set;} 
} 
+1

Le deuxième exemple est parfaitement correct ... Et les espaces de noms n'ont rien à voir avec l'accessibilité. Le modificateur 'internal' restreint l'accès à l '** assembly ** où la classe est déclarée –

+0

Merci pour la confusion des espaces de noms/assemblages @Thomas. – TheVillageIdiot

+0

@TheVillageldiot: Eh bien, c'est vrai comme vous l'avez dit: "ça va, le test de classe ne sera pas accessible en dehors de l'espace de noms déclaré, donc la propriété publique ne changera rien." Mais qu'en est-il des classes imbriquées? par exemple, nous avons une classe (class1) qui a été déclarée comme interne avec des méthodes/propriétés publiques. En outre, nous avons une deuxième classe (classe2) qui a une propriété de type class1. class1 et class2 sont tous deux dans un assembly et le spécificateur d'accès de class2 est public. pouvons-nous voir la classe1 de l'assemblée, il était là? – odiseh

7

Pour votre question, la classe 1 qui est déclarée comme interne peut avoir une méthode publique.

Pourquoi?

Regardez Jon Skeets explanation:

Vous pouvez certainement marquer une classe comme interne, mais qui est différent de rendre ses membres publics internes. Par exemple, supposons que vous ayez une classe qui implémente une interface publique. Même si la classe peut être interne, une instance peut toujours "quitter l'assembly " en étant renvoyée par un membre dans une autre classe (publique). Cette instance devrait être référencé par l'interface qu'il implémente plutôt que le nom de la classe elle-même (comme la classe ne sait pas à l'assemblée extérieur) mais les méthodes publiques peut encore être appelé.

Si les méthodes publiques ne sont pas toutes les interfaces mise en œuvre, je soupçonne que il ne ferait une différence dans un très peu de cas de réflexion que vous ne se soucient pas.

wiki communautaire - que le crédit doit aller à Jon Skeet

+0

Merci beaucoup – odiseh

+0

Merci au maître Jon Skeet –

1

Oui, vous pouvez définir public les membres de internal/private/types etc.

Comme d'autres réponses ont noté, le code externe ne sera pas être en mesure de voir les propriétés à moins qu'il puisse voir le type - mais il y a beaucoup de nuances:

  • si le membre est sur une interface, il sera être (essentiellement) une partie de l'API publique
  • le membre pourrait être un remplacement public d'un membre virtuel/abstrait - dans ce cas sera vraiment visible publiquement, mais via la classe de base (encore une fois, similaire aux interfaces

Mais il y a beaucoup d'autres codes dans le cadre qui utilise réflexion et exige l'accès du public:

  • liaison de données fonctionne généralement sur les propriétés publiques
  • contrôles de sécurité pour de confiance partielle peut être pointilleux sur publique membres
  • sérialisation (par exemple XmlSerializer) peuvent souhaiter les membres du public
  • etc

Alors Il y a encore beaucoup de raisons de penser à public plutôt que seulement internal, même si votre code est seulement référencé par l'assemblée locale.

Questions connexes