Niveau de Protection d'un struct domaine au sein d'une classe
Je suis assez nouveau à la programmation en C#, donc c'est probablement une question de débutant.
- Je obtenir un "'A. Test.Qu'.Échoue "est inaccessible en raison de son niveau de protection" erreur sur l'extrait de code suivant et je n'arrive pas à comprendre la raison.
namespace A
{
class Test
{
public void Demo()
{
That[] it = new That[42];
it[0].fails = 21;
}
public struct That
{
int fails;
}
}
}
Venant de la programmation en C++, et ayant lu que les règles de protection sont presque les mêmes, car il n'y a qu'une seule classe je m'attends à ce que cela fonctionne même si le That
struct et la Demo
méthode ont été private
.
Que la note de côté, un lien vers une page résumant champ d'application et les règles de protection vers le programmeur C++ serait grandement apprécié.
A.Test.That.fails
... intelligent. +1Voir Cody réponse; il y a une grande différence entre les structures et les classes en C#; à peine sont-ils liés, en fait. La plupart du temps que les gens utilisent un struct en C#, il est incorrect. Assurez-vous que vous utilisez pour les bonnes raisons. "Parce que c'est un objet simple" n'est pas une raison.
va "parce que je veux juste un rapide tableau de scalaires paires de" faire comme une excuse?
Oui, je dirais. Pas nécessairement parce que c'est simple ou rapide, mais parce que vous voulez le type de la valeur sémantique de ces scalaire paires. Ils doivent travailler comme un
int
, non pas comme un objet. Il est tout à fait logique qu'ils soient immuables. J'ai choisi une structure pour que, trop.Sur un tangentielle remarque: Dans le cas que vous n'avez pas veux votre fonctionnement interne du public, mais ont besoin de leur public, de toute façon,
InternalsVisibleTo
vous permet de faire une classe interne visible à l'externe spécifique de l'assemblée. C'est surtout utile pour les tests unitaires.OriginalL'auteur Julien Guertault | 2011-03-28
Vous devez vous connecter pour publier un commentaire.
Les autres réponses ont déjà votre réponse, donc je ne vais pas battre un cheval mort ici. Vous devez déclarer le terrain
public
afin d'être en mesure d'y accéder à partir d'un code externe.En C++, les structures et les classes sont équivalentes, avec la seule différence étant le niveau d'accès par défaut de leurs membres respectifs.
Cependant, ce n'est pas le cas en C#. Généralement, vous ne devez utiliser une structure pour les petits objets éphémères qui sont immuables (ne change pas). Une structure a type de valeur sémantique, où une classe a type de référence sémantique. Il est très important que vous compreniez la différence entre les types valeur et les types référence si vous êtes en train d'apprendre à programmer en C#. Jon Skeet a publié un article qui tente de fournir cette explication. Mais vous aurez certainement envie de prendre un bon livre d'introduction à C# qui traite de ces questions plus en détail.
Plus souvent que pas, vous aurez envie d'utiliser une classe en C#, plutôt que d'une structure. Et quand vous l'utilisation de cette classe, notons que Microsoft les lignes directrices de conception pour C# tendance à recommander contre exposer les champs publics. Au lieu de cela, ils recommandent que vous utilisez une propriété publique, soutenu par un champ privé. Plus approfondie de l'exposition de la justification de cette directive est donnée ici. Par exemple:
Ou vous pouvez utiliser le simple "automatique" propriétés de la syntaxe, qui a le compilateur de générer automatiquement privé de la sauvegarde de domaine:
Bien sûr. J'ai pris l'exemple a été conçu pour des fins de démonstration uniquement. Bien évidemment, dans le monde réel il y a, en effet, légitime le cas où vous souhaitez utiliser une struct. Pas seulement pour le type de valeur de la sémantique, mais aussi pour des fins d'interopérabilité. Mais en général, les objets sont mieux modélisés à l'aide d'une classe en C#.
+1 Win32 interop m'a forcé en flagrant utilisation de structs dans mon application WPF,... et je suis detesting.
Mais bien sûr, je suppose que vous avez placé toutes ces structures dans un autre espace de noms et/ou d'assemblage, et déclaré qu'il soit privé ou interne. J'ai toujours écrire une belle, propre classe wrapper géré sur l'interopérabilité du code, qui est la seule chose que je exposer publiquement.
C'est exactement ce que je fais.
OriginalL'auteur Cody Gray
Le modificateur d'accès par défaut en C# pour la struct champs (champs de la classe) est
private
. Doncint fails;
est privé de votre structure, sauf si vous déclarez publique.OriginalL'auteur BoltClock
consultez la réponse à la cette question
Que membre est déclaré en privé, par défaut, vous avez besoin de mettre la
public
modificateur avant.OriginalL'auteur Andras Zoltan
Parce que
fails
n'est paspublic
.. par défaut les champs dansstruct
et mêmeclass
sontprivate
Selon MSDN
vous êtes les bienvenus.. j'ai ajouté un lien vers la doc MSDN pour votre référence . 🙂
OriginalL'auteur Shekhar_Pro
Les membres privés de Test limiter à Tester lui-même et ne sont pas disponibles à l'extérieur de Test. La démo est en dehors de Test. Il n'a pas d'importance qui la parent.
Définir Démo à l'intérieur de Test et vous pouvez accéder aux membres privés.
Bien sûr. Il n'est pas à l'intérieur de la définition de l'Essai, de sorte qu'il est à l'extérieur. CQFD. À l'intérieur, il doit être à l'intérieur des accolades de la struct Test lui-même.
OriginalL'auteur Stephen Chung