10
votes

Niveau de protection d'un champ d'art dans une classe

Je suis assez nouveau à la programmation C #, il s'agit probablement d'une question de débutant.

Je reçois un "''.test.test.fa.fails' est inaccessible en raison de son niveau de protection" sur l'extrait de code suivant et je ne comprends pas la raison. xxx

provenant de la programmation C ++ et ayant lu que les règles de protection sont presque identiques, car il y a une seule classe I S'attendre à ce qu'il fonctionne même si le que struct et la méthode de démonstration était privé .

comme la note latérale , un lien vers certaines pages résumant les règles de portée et de protection vers le programmeur C ++ serait grandement apprécié.


5 commentaires

a.test.that.fails ... intelligent. +1


Voir la réponse de Cody; Il y a une grande différence entre les structures et les classes en C #; Ils sont à peine liés, en fait. La plupart des temps que les gens utilisent une structure en C #, il est incorrect. Assurez-vous de l'utiliser pour la bonne raison. "Parce que c'est un objet simple" n'est pas une telle raison.


@BoltClock :;) @marc: Will "Parce que je veux juste un tableau rapide de paires scalaires" faire comme une excuse?


Oui, je le dirais. Pas nécessairement parce que c'est simple ou rapide, mais parce que vous voulez une sémantique de type de valeur pour ces paires scalaires. Ils devraient travailler comme un int , pas comme un objet. Cela fait un sens logique qu'ils soient immuables. Je choisirais une structure pour ça aussi.


Sur une note tangentielle: dans le cas où vous ne voulez pas VOUS VOS INTERNAUNAULS PUBLIQUE Mais avez besoin d'être public de toute façon, InternalsVissileto vous permet de faire une classe interne visible à un Assemblage externe spécifique. Ceci est principalement utile pour les tests unitaires.


5 Réponses :


4
votes

Le modificateur d'accès par défaut dans C # pour les champs de structure (et les champs de classe) est privé . Donc int échide; est privé à votre structure, à moins que vous ne le déclarais public.


0 commentaires


1
votes

Les membres privés de test restreint pour se tester et ne sont pas disponibles en dehors du test. La démo est en dehors du test. Peu importe qui est le parent.

Définir la démonstration à l'intérieur du test et vous pouvez accéder aux membres privés.


1 commentaires

Bien sûr. Ce n'est pas à l'intérieur de la définition du test, de sorte qu'il est à l'extérieur. QED. Être à l'intérieur, il doit être dans les accolades de la structure de test elle-même.



2
votes

car échoue n'est pas public . Par défaut des champs dans struct et même classe sont privé

Selon MSDN

Le niveau d'accès pour Classe Membres et STRIT Membres, y compris les classes et les structures imbriquées, est privé par défaut .


2 commentaires

Ok je l'ai eu, pas comme C / C ++ où les champs de struct sont publics par défaut. Merci.


Vous êtes la bienvenue .. J'ai ajouté un lien vers MSDN DOC pour votre référence. :)



11
votes

Les autres réponses données ont déjà votre réponse, je ne vais donc pas battre un cheval mort ici. Vous devez déclarer le champ public afin de pouvoir y accéder à partir du code externe.

en C ++, les structures et les classes sont équivalents, la seule différence étant le niveau d'accès par défaut de leur respectif. Membres.

Cependant, ce n'est pas le cas en C #. Généralement, vous ne devez utiliser une structure que pour les petits objets de courte durée qui sont immuables (ne changeront pas). Une structure a type de valeur sémantique, où comme une classe a type de référence sémantique. Il est très important que vous compreniez la différence entre les types de valeur et les types de référence si vous apprenez à programmer en C #. Jon Skeet a publié un article qui tente de fournir cette explication. Mais vous voudrez certainement récupérer un bon livre d'introduction à C # qui traite ces problèmes plus en détail.

plus souvent que non, vous voudrez utiliser une classe en C #, plutôt qu'une structure . Et lorsque vous utilisez cette classe, notez que les directives de conception de Microsoft pour C # ont tendance à recommander contre exposer les champs publics. Au lieu de cela, ils vous recommandent d'utiliser une propriété publique, soutenu par un domaine privé. Une exposition plus approfondie de la justification de cette ligne directrice est donnée ici . Par exemple: xxx

ou vous pouvez utiliser la syntaxe "de propriétés automatiques" plus simple, que le compilateur génère automatiquement ce champ de support privé: xxx < / pré>


4 commentaires

Oui, pour l'exemple de l'exemple que j'ai mis au public, mais dans la vie réelle, les choses vont aussi privilégiées que possible, et cette capacité à définir le réglage / à vous aider clairement. Merci pour l'aperçu et le lien.


@ Julien: Bien sûr. J'ai supposé que l'exemple a été conçu pour une démonstration uniquement. Évidemment dans le monde réel, il existe des cas légitimes où vous souhaitez utiliser une structure. Non seulement pour la sémantique de type valeur, mais aussi pour des fins interopes. Mais en général, les objets sont mieux modélisés à l'aide d'une classe en C #.


+1 Win32 Interop nous a forcé dans une utilisation flagrante des structures dans mon application WPF ... et je déteste ça.


@Bolt: Mais bien sûr, je suppose que vous avez placé toutes ces structures dans un espace de noms et / ou un assemblage séparé, et les ont déclarés privés ou internes. J'écris toujours une belle classe d'enveloppe gérée propre sur le code INTEROP, qui est la seule chose que j'expose publiquement.