Заметка
Доступ к этой странице требует авторизации. Вы можете попробовать войти в систему или изменить каталог.
Доступ к этой странице требует авторизации. Вы можете попробовать сменить директорию.
Управление доступом относится к объявлению того, какие клиенты могут использовать определенные элементы программы, такие как типы, методы и функции.
Основы управления доступом
В F# описатели publicinternalуправления доступом и private могут применяться к модулям, типам, методам, определениям значений, функциям, свойствам и явным полям.
publicуказывает, что сущность может получить доступ ко всем вызывающим абонентам.internalуказывает, что сущность может быть доступна только из той же сборки.privateуказывает, что сущность может быть доступна только из заключенного типа или модуля.
Замечание
Описатель protected доступа не используется в F#, хотя это допустимо, если вы используете типы, созданные на языках, поддерживающих protected доступ. Таким образом, если переопределить защищенный метод, метод остается доступным только в пределах класса и его потомков.
Описатель доступа помещается перед именем сущности.
Если описатель доступа не используется public, значение по умолчанию — за исключением let привязок в типе, которые всегда private относятся к типу.
Подписи в F# предоставляют другой механизм управления доступом к элементам программы F#. Подписи не требуются для управления доступом. Дополнительные сведения см. в разделе "Подписи".
Правила управления доступом
Управление доступом распространяется на следующие правила:
Объявления наследования (т. е. использование
inheritдля указания базового класса для класса), объявлений интерфейса (т. е. указание того, что класс реализует интерфейс) и абстрактные члены всегда имеют одинаковые специальные возможности, что и вложенный тип. Поэтому в этих конструкциях нельзя использовать описатель управления доступом.Доступность отдельных случаев в различаемом союзе определяется доступностью самого различаемого объединения. То есть, конкретный случай объединения не менее доступен, чем сам союз.
Специальные возможности для отдельных полей типа записи определяются специальными возможностями самой записи. То есть определенная метка записи не менее доступна, чем сама запись.
Пример
В следующем коде показано использование описателей управления доступом. В проекте есть два файла и Module1.fsModule2.fs. Каждый файл является неявным модулем. Таким образом, существует два модуля и Module1Module2. Частный тип и внутренний тип определяются в Module1. К частному типу не удается получить доступ Module2, но внутренний тип может.
// 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.
// 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