アクセス制御Access Control

アクセス制御とは、型、メソッド、関数など、特定のプログラム要素を使用できるクライアントを宣言することを指します。Access control refers to declaring which clients can use certain program elements, such as types, methods, and functions.

Access Control の基礎Basics of Access Control

でF#は、アクセス制御指定子 publicinternal、および private をモジュール、型、メソッド、値定義、関数、プロパティ、および明示的なフィールドに適用できます。In F#, the access control specifiers public, internal, and private can be applied to modules, types, methods, value definitions, functions, properties, and explicit fields.

  • public は、すべての呼び出し元がエンティティにアクセスできることを示します。public indicates that the entity can be accessed by all callers.

  • internal は、同じアセンブリからエンティティにアクセスできることを示します。internal indicates that the entity can be accessed only from the same assembly.

  • private は、外側の型またはモジュールからのみエンティティにアクセスできることを示します。private indicates that the entity can be accessed only from the enclosing type or module.

注意

アクセス指定子 protected はでF#は使用されませんが、protected アクセスをサポートする言語で作成された型を使用している場合は許容されます。The access specifier protected is not used in F#, although it is acceptable if you are using types authored in languages that do support protected access. したがって、保護されたメソッドをオーバーライドすると、メソッドはクラスとその子孫内でのみアクセス可能な状態になります。Therefore, if you override a protected method, your method remains accessible only within the class and its descendents.

一般に、指定子は、mutable または inline 指定子が使用されている場合を除き、エンティティの名前の前に配置されます。これは、アクセス制御指定子の後に表示されます。In general, the specifier is put in front of the name of the entity, except when a mutable or inline specifier is used, which appear after the access control specifier.

アクセス指定子が使用されていない場合、既定値は publicになります。ただし、型の let バインディングの場合は、常に型に private ます。If no access specifier is used, the default is public, except for let bindings in a type, which are always private to the type.

のシグネチャF#には、プログラム要素へのF#アクセスを制御するための別のメカニズムが用意されています。Signatures in F# provide another mechanism for controlling access to F# program elements. アクセス制御に署名は必要ありません。Signatures are not required for access control. 詳細については、「シグネチャ」を参照してください。For more information, see Signatures.

Access Control の規則Rules for Access Control

アクセス制御には、次の規則が適用されます。Access control is subject to the following rules:

  • 継承宣言 (つまり、クラスの基底クラスを指定するために inherit を使用する)、インターフェイス宣言 (つまり、クラスがインターフェイスを実装することを指定する) と、抽象メンバーは、外側の型と同じアクセシビリティを常に持っています。Inheritance declarations (that is, the use of inherit to specify a base class for a class), interface declarations (that is, specifying that a class implements an interface), and abstract members always have the same accessibility as the enclosing type. したがって、アクセス制御指定子は、これらのコンストラクトでは使用できません。Therefore, an access control specifier cannot be used on these constructs.

  • 判別共用体の個々のケースのアクセシビリティは、判別共用体自体のアクセシビリティによって決まります。Accessibility for individual cases in a discriminated union is determined by the accessibility of the discriminated union itself. つまり、特定の共用体ケースは、共用体自体よりもアクセシビリティが低くなります。That is, a particular union case is no less accessible than the union itself.

  • レコード型の個々のフィールドのアクセシビリティは、レコード自体のアクセシビリティによって決まります。Accessibility for individual fields of a record type is determined by the accessibility of the record itself. つまり、特定のレコードラベルは、レコード自体よりもアクセスできなくなります。That is, a particular record label is no less accessible than the record itself.

Example

次のコードは、アクセス制御指定子の使用方法を示しています。The following code illustrates the use of access control specifiers. プロジェクトには、Module1.fsModule2.fsの2つのファイルがあります。There are two files in the project, Module1.fs and Module2.fs. 各ファイルは暗黙的にモジュールです。Each file is implicitly a module. したがって、Module1Module2の2つのモジュールがあります。Therefore, there are two modules, Module1 and Module2. プライベート型と内部型は Module1で定義されます。A private type and an internal type are defined in Module1. プライベート型に Module2からアクセスすることはできませんが、内部型ではアクセスできます。The private type cannot be accessed from Module2, but the internal type can.

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

次のコードは、Module1.fsで作成された型のアクセシビリティをテストします。The following code tests the accessibility of the types created 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

関連項目See also