Toegangsbeheer

Toegangsbeheer verwijst naar declaraties welke clients bepaalde programma-elementen kunnen gebruiken, zoals typen, methoden en functies.

Basisbeginselen van toegangsbeheer

In F# kunnen de aanduidingen voor toegangsbeheer publicinternalworden private toegepast op modules, typen, methoden, waardedefinities, functies, eigenschappen en expliciete velden.

  • public geeft aan dat de entiteit toegankelijk is voor alle bellers.

  • internal geeft aan dat de entiteit alleen toegankelijk is vanuit dezelfde assembly.

  • private geeft aan dat de entiteit alleen toegankelijk is vanuit het insluittype of de module.

Notitie

De toegangsaanduiding protected wordt niet gebruikt in F#, hoewel dit acceptabel is als u typen gebruikt die zijn geschreven in talen die toegang ondersteunen protected . Als u een beveiligde methode overschrijft, blijft uw methode daarom alleen toegankelijk binnen de klasse en de bijbehorende afstammingen.

De toegangsaanduiding wordt vóór de naam van de entiteit geplaatst.

Als er geen toegangsaanduiding wordt gebruikt, is publicde standaardwaarde , met uitzondering van let bindingen in een type, die altijd private voor het type zijn.

Handtekeningen in F# bieden een ander mechanisme voor het beheren van de toegang tot F#-programma-elementen. Handtekeningen zijn niet vereist voor toegangsbeheer. Zie Handtekeningen voor meer informatie.

Regels voor toegangsbeheer

Toegangsbeheer is onderworpen aan de volgende regels:

  • Overnamedeclaraties (dat wil bijvoorbeeld het gebruik van het opgeven van inherit een basisklasse voor een klasse), interfacedeclaraties (dat wil bijvoorbeeld opgeven dat een klasse een interface implementeert) en abstracte leden hebben altijd dezelfde toegankelijkheid als het insluittype. Daarom kan geen aanduiding voor toegangsbeheer worden gebruikt voor deze constructies.

  • Toegankelijkheid voor individuele gevallen in een gediscrimineerde vereniging wordt bepaald door de toegankelijkheid van de gediscrimineerde unie zelf. Dat wil gezegd, een bepaalde union case is niet minder toegankelijk dan de unie zelf.

  • Toegankelijkheid voor afzonderlijke velden van een recordtype wordt bepaald door de toegankelijkheid van de record zelf. Een bepaald recordlabel is dus niet minder toegankelijk dan de record zelf.

Opmerking

De volgende code illustreert het gebruik van aanduidingen voor toegangsbeheer. Er zijn twee bestanden in het project en Module1.fsModule2.fs. Elk bestand is impliciet een module. Daarom zijn er twee modules en Module1Module2. Een privétype en een intern type worden gedefinieerd in Module1. Het privétype kan niet worden geopend vanuit Module2, maar het interne type kan.

// 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

Met de volgende code wordt de toegankelijkheid getest van de typen die zijn gemaakt in 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

Zie ook