Note
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de vous connecter ou de changer d’annuaire.
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de changer d’annuaire.
Le contrôle d’accès fait référence à la déclaration des clients qui peuvent utiliser certains éléments de programme, tels que des types, des méthodes et des fonctions.
Notions de base du contrôle d’accès
Dans F#, les spécificateurs de contrôle d’accès, internalet private peuvent être appliqués publicaux modules, types, méthodes, définitions de valeurs, fonctions, propriétés et champs explicites.
publicindique que l’entité est accessible par tous les appelants.internalindique que l’entité est accessible uniquement à partir du même assembly.privateindique que l’entité est accessible uniquement à partir du type ou du module englobant.
Remarque
Le spécificateur protected d’accès n’est pas utilisé en F#, bien qu’il soit acceptable si vous utilisez des types créés dans des langages qui prennent en charge protected l’accès. Par conséquent, si vous remplacez une méthode protégée, votre méthode reste accessible uniquement dans la classe et ses descendants.
Le spécificateur d’accès est placé devant le nom de l’entité.
Si aucun spécificateur d’accès n’est utilisé, la valeur par défaut est public, à l’exception let des liaisons dans un type, qui sont toujours private au type.
Les signatures en F# fournissent un autre mécanisme permettant de contrôler l’accès aux éléments de programme F#. Les signatures ne sont pas requises pour le contrôle d’accès. Pour plus d’informations, consultez Signatures.
Règles de contrôle d’accès
Le contrôle d’accès est soumis aux règles suivantes :
Les déclarations d’héritage (autrement dit, l’utilisation de la classe de
inheritbase pour une classe), les déclarations d’interface (autrement dit, la spécification qu’une classe implémente une interface) et les membres abstraits ont toujours la même accessibilité que le type englobant. Par conséquent, un spécificateur de contrôle d’accès ne peut pas être utilisé sur ces constructions.L’accessibilité pour les cas individuels d’une union discriminatoire est déterminée par l’accessibilité de l’union discriminatoire elle-même. C’est-à-dire qu’un cas particulier d’union n’est pas moins accessible que le syndicat lui-même.
L’accessibilité pour les champs individuels d’un type d’enregistrement est déterminée par l’accessibilité de l’enregistrement lui-même. Autrement dit, une étiquette d’enregistrement particulière n’est pas moins accessible que l’enregistrement lui-même.
Exemple :
Le code suivant illustre l’utilisation des spécificateurs de contrôle d’accès. Il existe deux fichiers dans le projet et Module1.fsModule2.fs. Chaque fichier est implicitement un module. Par conséquent, il existe deux modules et Module1Module2. Un type privé et un type interne sont définis dans Module1. Le type privé n’est pas accessible à partir de Module2, mais le type interne peut.
// Module1.fs
module Module1
// This type is not usable outside of this file
type private MyPrivateType() =
// x is private since this is an internal let binding
let x = 5
// X is private and does not appear in the QuickInfo window
// when viewing this type in the Visual Studio editor
member private this.X() = 10
member this.Z() = x * 100
type internal MyInternalType() =
let x = 5
member private this.X() = 10
member this.Z() = x * 100
// Top-level let bindings are public by default,
// so "private" and "internal" are needed here since a
// value cannot be more accessible than its type.
let private myPrivateObj = new MyPrivateType()
let internal myInternalObj = new MyInternalType()
// let bindings at the top level are public by default,
// so result1 and result2 are public.
let result1 = myPrivateObj.Z
let result2 = myInternalObj.Z
Le code suivant teste l’accessibilité des types créés dans Module1.fs.
// Module2.fs
module Module2
open Module1
// The following line is an error because private means
// that it cannot be accessed from another file or module
// let private myPrivateObj = new MyPrivateType()
let internal myInternalObj = new MyInternalType()
let result = myInternalObj.Z