액세스 제어
액세스 제어 는 형식, 메서드 및 함수와 같은 특정 프로그램 요소를 사용할 수 있는 클라이언트를 선언하는 것을 말합니다.
Access Control의 기본 사항
F#에서 액세스 제어 지정자는 public
internal
private
모듈, 형식, 메서드, 값 정의, 함수, 속성 및 명시적 필드에 적용할 수 있습니다.
public
는 모든 호출자가 엔터티에 액세스할 수 있음을 나타냅니다.internal
는 엔터티가 동일한 어셈블리에서만 액세스할 수 있음을 나타냅니다.private
는 엔터티가 바깥쪽 형식 또는 모듈에서만 액세스할 수 있음을 나타냅니다.
참고 항목
액세스 지정자는 protected
F#에서 사용되지 않지만 액세스를 지원하는 protected
언어로 작성된 형식을 사용하는 경우 허용됩니다. 따라서 보호된 메서드를 재정의하는 경우 메서드는 클래스 및 해당 하위 항목 내에서만 액세스할 수 기본.
액세스 지정자가 엔터티 이름 앞에 배치됩니다.
액세스 지정자가 사용되지 않는 경우 기본값은 public
형식의 바인딩을 제외하고 let
항상 private
형식에 대한 바인딩입니다.
F#의 서명은 F# 프로그램 요소에 대한 액세스를 제어하기 위한 다른 메커니즘을 제공합니다. 액세스 제어에는 서명이 필요하지 않습니다. 자세한 내용은 시그니처를 참조하세요.
액세스 제어 규칙
액세스 제어에는 다음 규칙이 적용됩니다.
상속 선언(즉, 클래스의
inherit
기본 클래스를 지정하는 데 사용), 인터페이스 선언(즉, 클래스가 인터페이스를 구현하도록 지정) 및 추상 멤버는 항상 바깥쪽 형식과 동일한 접근성을 갖습니다. 따라서 이러한 구문에는 액세스 제어 지정자를 사용할 수 없습니다.차별된 공용 구조체의 개별 사례에 대한 접근성은 차별된 공용 구조체 자체의 접근성에 따라 결정됩니다. 즉, 특정 노조 사례는 노조 자체보다 접근성이 낮습니다.
레코드 형식의 개별 필드에 대한 접근성은 레코드 자체의 접근성에 따라 결정됩니다. 즉, 특정 레코드 레이블은 레코드 자체보다 더 쉽게 액세스할 수 없습니다.
예시
다음 코드에서는 액세스 제어 지정자의 사용을 보여 줍니다. 프로젝트에 Module1.fs
는 두 개의 파일이 있습니다 Module2.fs
. 각 파일은 암시적으로 모듈입니다. 따라서 두 개의 모듈과 Module1
Module2
. 프라이빗 형식 및 내부 형식은 에 정의되어 있습니다 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
참고 항목
.NET