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" em> sur l'extrait de code suivant et je ne comprends pas la raison. p> 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 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é. p> p> que code> struct et la méthode de démonstration code> code> était
privé code>. p>
5 Réponses :
Le modificateur d'accès par défaut dans C # pour les champs de structure (et les champs de classe) est privé code>. Donc
int échide; code> est privé à votre structure, à moins que vous ne le déclarais public. P>
S'il vous plaît voir la réponse à Cette question a> p>
Ce membre est déclaré privé par défaut - Vous devez mettre le modificateur public code> avant. p>
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. P>
Définir la démonstration à l'intérieur du test et vous pouvez accéder aux membres privés. P>
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.
car Selon MSDN P>
Le niveau d'accès échoue code> n'est pas
public code>. Par défaut des champs dans
struct code> et même
classe code> sont
privé code> p>
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. :)
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 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. P> 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 em> sémantique, où comme une classe a type de référence em> 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. P> 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 em> 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: p> 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é: p> public code> afin de pouvoir y accéder à partir du code externe.
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.
a.test.that.fails code> ... 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 code>, 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 I> VOS INTERNAUNAULS PUBLIQUE Mais avez besoin d'être public de toute façon,
InternalsVissileto Code> vous permet de faire une classe interne visible à un Assemblage externe spécifique. Ceci est principalement utile pour les tests unitaires.