J'ai essayé de rendre une classe privée et j'ai cette erreur "Les éléments définis dans un espace de noms ne peuvent pas être explicitement déclarés comme privés, protégés ou internes protégés"
J'ai compris son sens mais je veux demander pourquoi cela n'est pas autorisé? Tous les modifires d'accès ne sont-ils pas applicables en classe? Pourquoi je ne peux pas rendre une classe privée, protégée ou protégée en interne?
Parce que privé signifie que le membre n'est visible que dans la classe contenue. Puisqu'une classe de niveau supérieur ne contient pas de classe, elle ne peut pas être privée (ou protégée). (Internes ou publics sont des modificateurs valides cependant).
Que voulez-vous que privé signifie dans une classe de haut niveau?
Bien sûr, tous les modificateurs s’appliquent aux classes imbriquées, c’est-à-dire à une classe définie dans une autre classe.
Vous pouvez utiliser uniquement public
ou internal
au niveau de l'espace de noms.
Parce que ça n'a pas de sens. Vous ne pouvez pas accéder aux classes protégées ou privées définies au niveau de l'espace de noms, uniquement en tant que classes imbriquées.
Comme le dit Abatonime , vous ne pouvez utiliser que public
ou internal
au niveau de l'espace de noms.private
, protected
ou protected internal
ne peut être utilisé qu'au niveau classe.
Cela marche
namespace X
{
class A
{
// class code here
private class B
{
// class code here
}
}
}
Ce ne sera pas
namespace X
{
class A
{
// class code here
}
private class B
{
// class code here
}
}
Seules les classes imbriquées peuvent être déclarées comme privées . Les classes non imbriquées ne peuvent être que publiques ou internes (implicites sans modificateurs).
J'ai eu le même problème parce que je créais une coutume DLL et que je voulais seulement que certaines classes soient visibles pour une application utilisant la DLL. Je supprime donc complètement le modificateur pour les classes que je voulais être privées (dans des espaces de noms spécifiques). Les classes sont restées accessibles aux autres classes du même espace-noms dans DLL - mais ne se sont pas affichées dans Intellisense dans l'application appelante. Pas besoin de classes imbriquées. La seule explication à laquelle je puisse penser est que le message d'erreur indique que vous ne pouvez pas déclarer "explicitement" privé ... il ne dit rien implicitement.
namespace SmartCardAuthentication
{
class SmartCardIdentity : IIdentity
{
private string _firstName;
private string _lastName;
private string _middleInitial;
....
}
}
Dans l'exemple de code ci-dessus, la classe "SmartCardIdentity" est disponible pour les autres classes du même espace de nom, mais pas pour l'application appelante lorsque cette classe est intégrée dans une DLL. Je ne l'ai pas testé d'une autre manière (c'est-à-dire la visibilité d'une classe dans un espace de noms différent dans la DLL.).
Dans le monde réel, nous nous concentrons sur l'objet visible Une fois que l'objet est visible, nous parlons de la portée de l'objet.
exemple dans le monde réel
Si vous marchez dans la rue, vous voyez des maisons dans une colonie. Si la colonie est protégée, personne ne peut voir les maisons Il est considéré qu'aucune colonie aucune maison n'est présente
En programmation
Si nous rendons la classe privée/protégée au plus haut niveau, personne ne le sait
est-il présent à l'Assemblée?
corrigez-moi s'il vous plaît, si je suis hors de portée
L'accessibilité par défaut des types de niveau supérieur est internal
.
L'accessibilité par défaut des membres de classe et de structure est private
.
La seule accessibilité possible des membres d'interface et d'énum est public
.
Donc, une classe est par défaut private
, et si vous voulez y accéder, vous devez mettre public
avant cela.
Seuls Public et Internal sont applicables lors de la définition de la classe. Si aucun modificateur d'accès n'est défini avant la classe, la valeur par défaut est internal.
consultez MSDN - [ https://msdn.Microsoft.com/en-us/library/8fd16xs0(v=vs.90).aspx]