액세스 제어

액세스 제어 는 형식, 메서드 및 함수와 같은 특정 프로그램 요소를 사용할 수 있는 클라이언트를 선언하는 것을 말합니다.

Access Control의 기본 사항

F#에서 액세스 제어 지정자는 publicinternalprivate 모듈, 형식, 메서드, 값 정의, 함수, 속성 및 명시적 필드에 적용할 수 있습니다.

  • public 는 모든 호출자가 엔터티에 액세스할 수 있음을 나타냅니다.

  • internal 는 엔터티가 동일한 어셈블리에서만 액세스할 수 있음을 나타냅니다.

  • private 는 엔터티가 바깥쪽 형식 또는 모듈에서만 액세스할 수 있음을 나타냅니다.

참고 항목

액세스 지정자는 protected F#에서 사용되지 않지만 액세스를 지원하는 protected 언어로 작성된 형식을 사용하는 경우 허용됩니다. 따라서 보호된 메서드를 재정의하는 경우 메서드는 클래스 및 해당 하위 항목 내에서만 액세스할 수 기본.

액세스 지정자가 엔터티 이름 앞에 배치됩니다.

액세스 지정자가 사용되지 않는 경우 기본값은 public형식의 바인딩을 제외하고 let 항상 private 형식에 대한 바인딩입니다.

F#의 서명은 F# 프로그램 요소에 대한 액세스를 제어하기 위한 다른 메커니즘을 제공합니다. 액세스 제어에는 서명이 필요하지 않습니다. 자세한 내용은 시그니처를 참조하세요.

액세스 제어 규칙

액세스 제어에는 다음 규칙이 적용됩니다.

  • 상속 선언(즉, 클래스의 inherit 기본 클래스를 지정하는 데 사용), 인터페이스 선언(즉, 클래스가 인터페이스를 구현하도록 지정) 및 추상 멤버는 항상 바깥쪽 형식과 동일한 접근성을 갖습니다. 따라서 이러한 구문에는 액세스 제어 지정자를 사용할 수 없습니다.

  • 차별된 공용 구조체의 개별 사례에 대한 접근성은 차별된 공용 구조체 자체의 접근성에 따라 결정됩니다. 즉, 특정 노조 사례는 노조 자체보다 접근성이 낮습니다.

  • 레코드 형식의 개별 필드에 대한 접근성은 레코드 자체의 접근성에 따라 결정됩니다. 즉, 특정 레코드 레이블은 레코드 자체보다 더 쉽게 액세스할 수 없습니다.

예시

다음 코드에서는 액세스 제어 지정자의 사용을 보여 줍니다. 프로젝트에 Module1.fs 는 두 개의 파일이 있습니다 Module2.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

참고 항목