Quel est le modificateur d'accès par défaut pour les classes, méthodes, membres, constructeurs, délégués et interfaces?
la source
Quel est le modificateur d'accès par défaut pour les classes, méthodes, membres, constructeurs, délégués et interfaces?
L'accès par défaut pour tout en C # est "l'accès le plus restreint que vous puissiez déclarer pour ce membre" .
Ainsi, par exemple:
namespace MyCompany
{
class Outer
{
void Foo() {}
class Inner {}
}
}
est équivalent à
namespace MyCompany
{
internal class Outer
{
private void Foo() {}
private class Inner {}
}
}
La seule exception à cela consiste à restreindre une partie d'une propriété (généralement le setter) que l'accessibilité déclarée de la propriété elle-même:
public string Name
{
get { ... }
private set { ... } // This isn't the default, have to do it explicitly
}
Voici ce que la spécification C # 3.0 a à dire (section 3.5.1):
Selon le contexte dans lequel une déclaration de membre a lieu, seuls certains types d'accessibilité déclarée sont autorisés. En outre, lorsqu'une déclaration de membre ne comprend aucun modificateur d'accès, le contexte dans lequel la déclaration a lieu détermine l'accessibilité déclarée par défaut.
- Les espaces de noms ont implicitement une accessibilité déclarée publique. Aucun modificateur d'accès n'est autorisé sur les déclarations d'espace de noms.
- Les types déclarés dans les unités de compilation ou les espaces de noms peuvent avoir une accessibilité déclarée publique ou interne et par défaut une accessibilité déclarée interne.
- Les membres de la classe peuvent avoir l'un des cinq types d'accessibilité déclarée et par défaut l'accessibilité déclarée privée. (Notez qu'un type déclaré en tant que membre d'une classe peut avoir l'un des cinq types d'accessibilité déclarée, tandis qu'un type déclaré en tant que membre d'un espace de noms ne peut avoir qu'une accessibilité déclarée publique ou interne.)
- Les membres de structure peuvent avoir une accessibilité déclarée publique, interne ou privée et par défaut une accessibilité déclarée privée car les structures sont implicitement scellées. Les membres de structure introduits dans une structure (c'est-à-dire non hérités par cette structure) ne peuvent pas avoir d'accessibilité déclarée interne protégée ou protégée. (Notez qu'un type déclaré comme membre d'une structure peut avoir une accessibilité déclarée publique, interne ou privée, tandis qu'un type déclaré comme membre d'un espace de noms ne peut avoir qu'une accessibilité déclarée publique ou interne.)
- Les membres de l'interface ont implicitement une accessibilité déclarée publique. Aucun modificateur d'accès n'est autorisé sur les déclarations de membre d'interface.
- Les membres de l'énumération ont implicitement déclaré l'accessibilité publique. Aucun modificateur d'accès n'est autorisé sur les déclarations de membres d'énumération.
(Notez que les types imbriqués relèveraient des parties "membres de la classe" ou "membres de la structure" - et donc par défaut en visibilité privée.)
top level class: internal
method: private
members (unless an interface or enum): private (including nested classes)
members (of interface or enum): public
constructor: private (note that if no constructor is explicitly defined, a public default constructor will be automatically defined)
delegate: internal
interface: internal
explicitly implemented interface member: public!
class Foo : IFoo { IFoo.M() {} } ... Foo a = new Foo();
, vous ne pouvez pas y accéderM
aveca.M()
, cependant vous pouvez y accéder avec(a as IFoo).M()
. (Consultez les spécifications pour plus d'informations sur les détails)Réponse courte: accès minimum possible (cf. réponse de Jon Skeet).
Longue réponse:
Types non imbriqués , énumération et accessibilité des délégués ( ne peuvent avoir qu'une accessibilité interne ou publique )
Type imbriqué et accessibilité des membres
L'accessibilité d'un type imbriqué dépend de son domaine d'accessibilité, qui est déterminé à la fois par l'accessibilité déclarée du membre et le domaine d'accessibilité du type contenant immédiatement. Cependant, le domaine d'accessibilité d'un type imbriqué ne peut pas dépasser celui du type conteneur.
Remarque: CIL a également la disposition pour protégé et interne (par opposition à l'existant protégé "ou" interne), mais à ma connaissance ce n'est pas actuellement disponible pour une utilisation en C #.
Voir:
http://msdn.microsoft.com/en-us/library/ba0a1yw2.aspx
http://msdn.microsoft.com/en-us/library/ms173121.aspx
http://msdn.microsoft.com/en- us / library / cx03xt0t.aspx
(Man I love Microsoft URIs ...)
la source
Jetez un œil aux modificateurs d'accès (Guide de programmation C #)
la source
La classe est interne par défaut.
L'interface est interne par défaut.
Les membres de l'interface sont publics par défaut. (Les interfaces ne nous permettent pas de spécifier tout type d'accessibilité à ses membres.)
Remarque: Si vous essayez de spécifier un spécificateur d'accès aux membres de l'interface, il affiche une erreur de compilation.
La structure est interne par défaut.
la source
Je voudrais ajouter un lien de documentation. Découvrez plus de détails ici .
la source
La réponse la plus simple est la suivante .....
Tous les membres en C # acceptent toujours le modificateur LE MOINS accessible par défaut.
C'est pourquoi toutes les classes de niveau supérieur d'un assembly sont "internes" par défaut, ce qui signifie qu'elles sont publiques à l'assembly dans lequel elles se trouvent, mais privées ou exclues de l'accès aux assemblys externes. La seule autre option pour une classe de niveau supérieur est public qui est plus accessible. Pour les types imbriqués, tout est privé à l'exception de quelques rares exceptions comme les membres d'énumérations et d'interfaces qui ne peuvent être que publics. Quelques exemples. Dans le cas des classes et interfaces de niveau supérieur, les valeurs par défaut sont:
classe Animal identique à la classe interne Animal
interface Animal identique à l'interface publique Animal
Dans le cas de classes et d'interfaces imbriquées (à l'intérieur de types), les valeurs par défaut sont:
classe Animal identique à la classe privée Animal
interface Animal identique à l'interface privée Animal
Si vous supposez simplement que la valeur par défaut est toujours la plus privée, vous n'avez pas besoin d'utiliser d'accesseurs jusqu'à ce que vous deviez modifier la valeur par défaut. Facile.
la source
Interne est le modificateur par défaut
la source
Niveau d'espace de noms:
internal
Niveau de type:
private
la source