Freigeben über


Zugriffssteuerung

Die Zugriffssteuerung bezieht sich auf die Deklarierung, welche Clients bestimmte Programmelemente verwenden können, z. B. Typen, Methoden und Funktionen.

Grundlagen der Zugriffssteuerung

In F# können die Zugriffssteuerungsbezeichner public, internalund private auf Module, Typen, Methoden, Wertdefinitionen, Funktionen, Eigenschaften und explizite Felder angewendet werden.

  • public gibt an, dass auf die Entität von allen Anrufern zugegriffen werden kann.

  • internal gibt an, dass nur von derselben Assembly aus auf die Entität zugegriffen werden kann.

  • private gibt an, dass auf die Entität nur über den eingeschlossenen Typ oder modul zugegriffen werden kann.

Hinweis

Der Zugriffsbezeichner protected wird in F# nicht verwendet, obwohl er akzeptabel ist, wenn Sie Typen verwenden, die in Sprachen erstellt wurden, die den Zugriff unterstützen protected . Wenn Sie daher eine geschützte Methode außer Kraft setzen, bleibt die Methode nur innerhalb der Klasse und der untergeordneten Objekte zugänglich.

Der Zugriffsbezeichner wird vor dem Namen der Entität platziert.

Wenn kein Zugriffsbezeichner verwendet wird, ist publicdie Standardeinstellung , mit Ausnahme von let Bindungen in einem Typ, die immer private für den Typ gelten.

Signaturen in F# bieten einen weiteren Mechanismus zum Steuern des Zugriffs auf F#-Programmelemente. Signaturen sind für die Zugriffssteuerung nicht erforderlich. Weitere Informationen finden Sie unter Signaturen.

Regeln für die Zugriffssteuerung

Die Zugriffssteuerung unterliegt den folgenden Regeln:

  • Vererbungsdeklarationen (d. h. die Verwendung einer inherit Basisklasse für eine Klasse), Schnittstellendeklarationen (d. h. angeben, dass eine Klasse eine Schnittstelle implementiert) und abstrakte Member verfügen immer über die gleiche Barrierefreiheit wie der eingeschlossene Typ. Daher kann für diese Konstrukte kein Zugriffssteuerungsbezeichner verwendet werden.

  • Die Zugänglichkeit einzelner Fälle in einer diskriminierten Vereinigung wird durch die Zugänglichkeit der diskriminierten Vereinigung selbst bestimmt. Das heißt, ein bestimmter Unionsfall ist nicht weniger zugänglich als die Gewerkschaft selbst.

  • Die Barrierefreiheit für einzelne Felder eines Datensatztyps wird durch die Barrierefreiheit des Datensatzes selbst bestimmt. Das heißt, eine bestimmte Datensatzbezeichnung ist nicht weniger zugänglich als der Datensatz selbst.

Beispiel

Der folgende Code veranschaulicht die Verwendung von Zugriffssteuerungsbezeichnern. Es gibt zwei Dateien im Projekt und Module1.fsModule2.fs. Jede Datei ist implizit ein Modul. Daher gibt es zwei Module und Module1Module2. Ein privater Typ und ein interner Typ werden in Module1definiert. Auf den privaten Typ kann nicht zugegriffen Module2werden, aber der interne Typ kann.

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

Der folgende Code testet die Barrierefreiheit der Typen, die 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

Siehe auch