Ok, ça me dérange .. Je sais que je l'ai lu quelque part et que Google ne m'aide pas.
Quel est le niveau d'accessibilité d'une méthode qui ne spécifie pas de modificateur d'accès?
void Foo()
{
//code
}
Je veux dire internal
mais je ne suis pas sûr à 100%.
L'accessibilité par défaut pour un type est internal
, mais l'accessibilité par défaut de ce type membres dépend du type.
En règle générale, les membres de class sont private
par défaut, alors que les membres de struct sont public
par défaut. Cela varie selon la langue. Les modificateurs d'accès aux structures par défaut pour C++ sont publics, tandis que pour C #, ils sont privés.
En supposant que ceci soit une méthode C #, puisque vous avez la balise ".net".
Les gens doivent faire la distinction entre l'accessibilité «membre» et l'accessibilité «classe».
Oui, internal
est la valeur par défaut pour les classes, mais private
est la valeur par défaut pour les membres.
Pour une classe: Interne est la valeur par défaut si aucun modificateur d'accès n'est spécifié.
Pour une méthode: Privé est la valeur par défaut si aucun modificateur d'accès n'est spécifié.
Extrait de Langage de programmation C #, Troisième édition de Anders Hejlsberg et al, section 10.3.5 ("Membres de la classe - Modificateurs d'accès"), page 434:
Une class-member-declaration peut avoir l'un des cinq types d'accessibilité déclarés possibles (§3.5.1):
public
,protected internal
,protected
,internal
ouprivate
. À l'exception de la combinaisonprotected internal
, la spécification de plusieurs modificateurs d'accès est une erreur de compilation. Lorsqu'un déclaration de membre de classe n'inclut aucun modificateur d'accès, on prendprivate
. [mine d'assistance]
Et ensuite à la section 11.2 ("Membres de la structure") à la page 539:
À l'exception des différences notées au § 11.3, les descriptions des membres du groupe fournies aux § 10.3 à 10.14 s'appliquent également aux membres de la structure.
La section 11.3 ne mentionne rien sur les modificateurs d'accès, ma lecture implique donc que les membres d'une struct
sans modificateur d'accès sont également private
par défaut. Cela correspond à ce que dit MSDN et à ma propre expérience.
Oh, attends, il y a encore une chose ...
Les déclarations de méthode interface
sont bien sûr public
par définition. Donc, l'implémentation suivante est public
, sans modificateur d'accès explicite.
public class MyClass : IEqualityComparer<MyClass>
bool IEqualityComparer<MyClass>.Equals(MyClass x , MyClass y) {}
}
Les méthodes de classe sont privées et scellées par défaut dans .NET. Cela signifie que la méthode est uniquement visible dans la classe et ne peut pas être remplacée par la classe héritée.