Megosztás a következőn keresztül:


Hozzáférés-vezérlés

A hozzáférés-vezérlés azt jelenti, hogy mely ügyfelek használhatnak bizonyos programelemeket, például típusokat, metódusokat és függvényeket.

A hozzáférés-vezérlés alapjai

Az F#-ban a hozzáférés-vezérlési azonosítók , internalés private alkalmazhatók publicmodulokra, típusokra, metódusokra, értékdefiníciókra, függvényekre, tulajdonságokra és explicit mezőkre.

  • public azt jelzi, hogy az entitás minden hívó számára elérhető.

  • internal azt jelzi, hogy az entitás csak ugyanabból a szerelvényből érhető el.

  • private azt jelzi, hogy az entitás csak a belefoglaló típusból vagy modulból érhető el.

Feljegyzés

A hozzáférés-meghatározó protected nem használatos az F#-ban, bár elfogadható, ha olyan nyelveken írt típusokat használ, amelyek támogatják protected a hozzáférést. Ezért ha felülbírál egy védett metódust, a metódus csak az osztályon és a leszármazottakon belül marad elérhető.

A hozzáférés-meghatározó az entitás neve elé kerül.

Ha nem használ hozzáférési azonosítót, az alapértelmezett érték publica típushoz tartozó kötések kivételével let , amelyek mindig private a típushoz tartoznak.

Az F#-ban lévő aláírások egy másik mechanizmust biztosítanak az F# programelemekhez való hozzáférés szabályozásához. A hozzáférés-vezérléshez nem szükséges aláírás. További információ: Aláírások.

Hozzáférés-vezérlési szabályok

A hozzáférés-vezérlésre a következő szabályok vonatkoznak:

  • Az öröklési deklarációk (vagyis az osztály alaposztályának inherit megadása), a felületi deklarációk (vagyis annak meghatározása, hogy egy osztály egy felületet implementál), és az absztrakt tagok mindig ugyanolyan akadálymentességgel rendelkeznek, mint a beágyazási típus. Ezért ezeken a szerkezeteken nem használható hozzáférés-vezérlési meghatározó.

  • A hátrányos megkülönböztetést alkalmazó unió egyes eseteinek hozzáférhetőségét maga a hátrányos megkülönböztetést alkalmazó unió akadálymentessége határozza meg. Vagyis egy adott uniós ügy nem kevésbé hozzáférhető, mint maga az unió.

  • A rekordtípus egyes mezőinek akadálymentességét maga a rekord akadálymentessége határozza meg. Vagyis egy adott rekordcímke nem kevésbé hozzáférhető, mint maga a rekord.

Példa

Az alábbi kód bemutatja a hozzáférés-vezérlési azonosítók használatát. A projektben két fájl található, Module1.fs és Module2.fsa . Minden fájl implicit módon modul. Ezért két modul van, Module1 és Module2. A privát típus és a belső típus a következőben van definiálva Module1: . A privát típus nem érhető el innen Module2, de a belső típus igen.

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

Az alábbi kód a létrehozott Module1.fstípusok akadálymentességét teszteli.

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

Lásd még