Erişim Denetimi

Erişim denetimi , hangi istemcilerin türler, yöntemler ve işlevler gibi belirli program öğelerini kullanabileceğini bildirmeyi ifade eder.

Erişim Denetiminin Temelleri

F# dilinde , ve private erişim denetimi tanımlayıcıları publicinternalmodüllere, türlere, yöntemlere, değer tanımlarına, işlevlere, özelliklere ve açık alanlara uygulanabilir.

  • public , varlığa tüm arayanlar tarafından erişilebileceğini gösterir.

  • internal , varlığa yalnızca aynı derlemeden erişilebileceğini gösterir.

  • private , varlığa yalnızca kapsayan türden veya modülden erişilebileceğini gösterir.

Not

Erişim tanımlayıcısı protected F# dilinde kullanılmaz, ancak erişimi destekleyen protected dillerde yazılmış türler kullanıyorsanız kabul edilebilir. Bu nedenle, korumalı bir yöntemi geçersiz kılarsanız, yönteminiz yalnızca sınıfı ve alt öğeleri içinde erişilebilir durumda kalır.

Erişim tanımlayıcısı varlığın adının önüne konur.

Hiçbir erişim tanımlayıcısı kullanılmazsa, her zaman private türüne olan bir türdeki bağlamalar dışında let varsayılan publicdeğerdir.

F# içindeki 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.

Erişim Denetimi Kuralları

Erişim denetimi aşağıdaki kurallara tabidir:

  • Devralma bildirimleri (yani, bir sınıf için bir temel sınıf belirtmek için kullanımı inherit ), arabirim bildirimleri (bir sınıfın arabirim uyguladığını belirtme) ve soyut üyeler her zaman kapsayan türle aynı erişilebilirliği elde eder. Bu nedenle, erişim denetimi tanımlayıcısı bu yapılarda kullanılamaz.

  • Ayrımcı birleşimdeki tek tek vakalar için erişilebilirlik, ayrımcı birleşimin erişilebilirliği tarafından belirlenir. Başka bir ifadeyle, belirli bir birleşim olayı, birleşimin kendisinden daha az erişilebilir değildir.

  • Kayıt türündeki tek tek alanlar için erişilebilirlik, kaydın kendi erişilebilirliği tarafından belirlenir. Başka bir ifadeyle, belirli bir kayıt etiketi kaydın kendisinden daha az erişilebilir değildir.

Örnek

Aşağıdaki kod, erişim denetimi tanımlayıcılarının kullanımını gösterir. Projede Module1.fs iki dosya vardır ve Module2.fs. Her dosya örtük olarak bir modüldür. Bu nedenle, ve Module2şeklinde iki modül vardırModule1. özel bir tür ve iç tür içinde Module1tanımlanır. Özel türe içinden Module2erişilemez, ancak iç tür erişebilir.

// 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 Module1.fsoluşturulan türlerin erişilebilirliğini test 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

Ayrıca bkz.