Erişim Denetimi
Erişim denetimi, hangi istemcilerin türler, yöntemler ve işlevler gibi belirli program öğelerini kullanabileceğini bildirerek ifade eder.
Temel Access Control
F# içinde, erişim denetimi belirtici public , internal ve private modüllere, türlere, yöntemlere, değer tanımlarına, işlevlere, özelliklere ve açık alanlara uygulanabilir.
public, varlığa tüm çağrıyı yapanlar tarafından erişilile olduğunu gösterir.internal, varlığa yalnızca aynı derlemeden erişilile olduğunu gösterir.private, varlığa yalnızca kapsayan tür veya modülden erişilile olduğunu gösterir.
Not
Erişim belirleyicisi F# dilinde kullanılmaz, ancak erişimi destekleyen dillerde yazma türleri kullanıyorsanız protected kabul protected edilebilir. Bu nedenle, korumalı bir yöntemi geçersiz kılarsanız, yönteminize yalnızca sınıfı ve onun alt tarafından erişilebilir durumda kalır.
Genel olarak, erişim denetimi belirleyiciden sonra görünen bir veya belirleyicisi kullanılmaları dışında, belirleyici varlığın adının mutable inline önüne konr.
Hiçbir erişim belirleyicisi kullanılmazsa, her zaman türünde olan bir türe bağlamalar dışında public let varsayılan private değeridir.
F# içinde imzalar, F# program öğelerine erişimi denetlemek için başka bir mekanizma sağlar. Erişim denetimi için imza gerekmez. Daha fazla bilgi için bkz. İmzalar.
Access Control için kurallar
Erişim denetimi aşağıdaki kurallara tabi olur:
Devralma bildirimleri (yani, bir sınıf için temel sınıf belirtmek için kullanımı), arabirim bildirimleri (yani, bir sınıfın bir arabirim uygulaydığını belirtme) ve soyut üyeler her zaman kapsayan türle aynı erişilebilirlik özelliklerine
inheritsahiptir. Bu nedenle, erişim denetimi belirleyicisi bu yapılarda kullanılamaz.Ayrımlı bir birliktelik içinde tek tek durumlar için erişilebilirlik, ayrımlı birliğin erişilebilirliği tarafından belirlenir. Başka bir ifadeyle, belirli bir birliktelik durumuna, birliğin kendisi kadar erişilemez.
Bir kayıt türünün tek tek alanları için erişilebilirlik, kaydın erişilebilirliği tarafından belirlenir. Başka bir ifadeyle, belirli bir kayıt etiketine kaydın kendisi kadar erişilemez.
Örnek
Aşağıdaki kod, erişim denetimi belirleyicilerinin kullanımını göstermektedir. Projede ve olmak için iki dosya Module1.fs Module2.fs vardır. Her dosya örtülü bir modüldür. Bu nedenle, ve olmak için iki modül Module1 Module2 vardır. özel türü ve iç türü içinde Module1 tanımlanır. Özel türe üzerinden Module2 erişilemez, ancak iç tür erişebilirsiniz.
// 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
Aşağıdaki kod, içinde oluşturulan türlerin erişilebilirliğini test Module1.fs ediyor.
// 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