특성(F#)

특성을 사용하면 프로그래밍 구문에 메타데이터를 적용할 수 있습니다.

구문

[<target:attribute-name(arguments)>]

설명

이전 구문 에서 대상 은 선택 사항이며, 있는 경우 특성이 적용되는 프로그램 엔터티의 종류를 지정합니다. 대상에 대한 유효한 값은 이 문서의 뒷부분에 나오는 표에 표시됩니다.

특성 이름은 일반적으로 특성 형식 이름에 사용되는 접미사가 Attribute 있거나 없는 유효한 특성 형식의 이름(네임스페이스로 정규화됨)을 나타냅니다. 예를 들어 이 컨텍스트에서만 Obsolete 형식 ObsoleteAttribute 을 단축할 수 있습니다.

인수특성 형식의 생성자에 대한 인수입니다. 특성에 매개 변수가 없는 생성자가 있는 경우 인수 목록 및 괄호를 생략할 수 있습니다. 특성은 위치 인수와 명명된 인수를 모두 지원합니다. 위치 인수 는 나타나는 순서대로 사용되는 인수입니다. 특성에 public 속성이 있는 경우 명명된 인수를 사용할 수 있습니다. 인수 목록에서 다음 구문을 사용하여 이러한 구문을 설정할 수 있습니다.

property-name = property-value

이러한 속성 초기화는 순서에 따라 할 수 있지만 위치 인수를 따라야 합니다. 다음은 위치 인수 및 속성 초기화를 사용하는 특성의 예입니다.

open System.Runtime.InteropServices

[<DllImport("kernel32", SetLastError=true)>]
extern bool CloseHandle(nativeint handle)

이 예제에서 특성은 DllImportAttribute다음과 같이 단축된 형식으로 사용됩니다. 첫 번째 인수는 위치 매개 변수이고 두 번째 인수는 속성입니다.

특성은 특성이라고 하는 개체를 형식 또는 다른 프로그램 요소와 연결할 수 있도록 하는 .NET 프로그래밍 구문입니다. 특성이 적용되는 프로그램 요소를 특성 대상이라고 합니다. 특성은 일반적으로 대상에 대한 메타데이터를 포함합니다. 이 컨텍스트에서 메타데이터는 필드 및 멤버 이외의 형식에 대한 모든 데이터일 수 있습니다.

F#의 특성은 함수, 메서드, 어셈블리, 모듈, 형식(클래스, 레코드, 구조체, 인터페이스, 대리자, 열거형, 공용 구조체 등), 생성자, 속성, 필드, 매개 변수, 형식 매개 변수 및 반환 값에 적용할 수 있습니다. 클래스, 식 또는 워크플로 식 내의 바인딩에는 특성이 허용되지 let 않습니다.

일반적으로 특성 선언은 특성 대상 선언 바로 앞에 나타납니다. 다음과 같이 여러 특성 선언을 함께 사용할 수 있습니다.

[<Owner("Jason Carlson")>]
[<Company("Microsoft")>]
type SomeType1 =

.NET 리플렉션을 사용하여 런타임에 특성을 쿼리할 수 있습니다.

이전 코드 예제와 같이 여러 특성을 개별적으로 선언하거나 다음과 같이 세미콜론을 사용하여 개별 특성과 생성자를 구분하는 경우 하나의 대괄호 집합에서 선언할 수 있습니다.

[<Owner("Darren Parker"); Company("Microsoft")>]
type SomeType2 =

일반적으로 발생하는 특성에는 특성, 보안 고려 사항의 특성, COM 지원 특성, 코드 소유권과 관련된 특성 및 형식을 serialize할 수 있는지 여부를 나타내는 특성이 포함 Obsolete 됩니다. 다음 예제에서는 특성의 Obsolete 사용을 보여 줍니다.

open System

[<Obsolete("Do not use. Use newFunction instead.")>]
let obsoleteFunction x y =
  x + y

let newFunction x y =
  x + 2 * y

// The use of the obsolete function produces a warning.
let result1 = obsoleteFunction 10 100
let result2 = newFunction 10 100

특성 대상 assemblymodule어셈블리의 최상위 do 바인딩에 특성을 적용합니다. 다음과 같이 단어 assembly 또는 ``module`` 특성 선언에 포함할 수 있습니다.

open System.Reflection
[<assembly:AssemblyVersionAttribute("1.0.0.0")>]
[<``module``:MyCustomModuleAttribute>]
do
   printfn "Executing..."

바인딩에 적용된 특성의 특성 대상을 do 생략하면 F# 컴파일러가 해당 특성에 적합한 특성 대상을 확인하려고 시도합니다. 많은 특성 클래스에는 해당 특성에 대해 지원되는 가능한 대상에 대한 정보가 포함된 형식 System.AttributeUsageAttribute 의 특성이 있습니다. 특성이 System.AttributeUsageAttribute 함수를 대상으로 지원한다는 것을 나타내는 경우 특성은 프로그램의 기본 진입점에 적용됩니다. 특성이 System.AttributeUsageAttribute 어셈블리를 대상으로 지원한다는 것을 나타내는 경우 컴파일러는 어셈블리에 적용할 특성을 사용합니다. 대부분의 특성은 함수와 어셈블리 모두에 적용되지 않지만, 이러한 특성이 적용되는 경우 이 특성은 프로그램의 기본 함수에 적용됩니다. 특성 대상이 명시적으로 지정되면 지정된 대상에 특성이 적용됩니다.

일반적으로 특성 대상을 명시적으로 지정할 필요는 없지만 사용 예제와 함께 특성의 대상에 대한 유효한 값은 다음 표에 나와 있습니다.

특성 대상 예시
assembly
[<assembly: AssemblyVersion("1.0.0.0")>]
모듈(module)
[<``module``: MyCustomAttributeThatWorksOnModules>]
return
let function1 x : [<return: MyCustomAttributeThatWorksOnReturns>] int = x + 1
field
[<DefaultValue>] val mutable x: int
속성
[<Obsolete>] this.MyProperty = x
param
member this.MyMethod([<Out>] x : ref<int>) = x := 10
type
[<type: StructLayout(LayoutKind.Sequential)>]
type MyStruct =
  struct
    val x : byte
    val y : int
  end

참고 항목