특성(C# 및 Visual Basic)
특성은 선언 정보를 메타데이터 또는 코드(어셈블리, 형식, 메서드, 속성 등)와 연결하는 강력한 방법을 제공합니다.특성이 프로그램 엔터티와 연결되면 리플렉션이라는 기술을 사용하여 런타임에 특성을 쿼리할 수 있습니다.자세한 내용은 리플렉션(C# 및 Visual Basic)를 참조하십시오.
특성에는 다음과 같은 속성이 있습니다.
특성은 사용자의 프로그램에 메타데이터를 추가합니다.메타데이터는 프로그램에 정의된 형식에 대한 정보입니다.모든 .NET 어셈블리에는 어셈블리에 정의된 형식과 형식 멤버를 설명하는 지정된 메타데이터 집합이 들어 있습니다.사용자 지정 특성을 추가하여 필요한 추가 정보를 지정할 수 있습니다.자세한 내용은 사용자 지정 특성 만들기(C# 및 Visual Basic)를 참조하십시오.
전체 어셈블리나 모듈뿐만 아니라 클래스 및 속성과 같은 작은 프로그램 요소에 여러 개의 특성을 적용할 수 있습니다.
메서드와 속성에 인수를 적용하는 것과 같은 방식으로 특성에도 적용할 수 있습니다.
리플렉션을 사용하여 프로그램에서 자체 메타데이터나 다른 프로그램의 메타데이터를 검사할 수 있습니다.자세한 내용은 리플렉션을 사용하여 특성 액세스(C# 및 Visual Basic)를 참조하십시오.
특성 사용
일부 특성은 유효한 선언 형식을 제한할 수 있지만 거의 대부분의 선언에 특성을 배치할 수 있습니다.C#에서는 특성이 적용되는 엔터티의 선언 위에 특성 이름을 대괄호([])로 묶어 배치하는 방법으로 특성을 지정합니다.Visual Basic에서는 특성을 꺾쇠 괄호(< >)로 묶습니다.특성은 동일한 줄에서 특성이 적용되는 요소 바로 앞에 와야 합니다.
다음 예제에서는 SerializableAttribute 특성을 사용하여 클래스에 구체적인 특징을 적용합니다.
<System.Serializable()> Public Class SampleClass
' Objects of this type can be serialized.
End Class
[System.Serializable]
public class SampleClass
{
// Objects of this type can be serialized.
}
예를 들어, DllImportAttribute 특성이 있는 메서드는 다음과 같이 선언합니다.
Imports System.Runtime.InteropServices
...
<System.Runtime.InteropServices.DllImport("user32.dll")>
Sub SampleMethod()
End Sub
using System.Runtime.InteropServices;
...
[System.Runtime.InteropServices.DllImport("user32.dll")]
extern static void SampleMethod();
한 선언에 특성을 두 개 이상 배치할 수 있습니다.
Imports System.Runtime.InteropServices
...
Sub MethodA(<[In](), Out()> ByVal x As Double)
End Sub
Sub MethodB(<Out(), [In]()> ByVal x As Double)
End Sub
using System.Runtime.InteropServices;
...
void MethodA([In][Out] ref double x) { }
void MethodB([Out][In] ref double x) { }
void MethodC([In, Out] ref double x) { }
일부 특성은 지정한 엔터티에 두 번 이상 지정할 수 있습니다.이러한 다용도 특성의 예는 ConditionalAttribute입니다.
<Conditional("DEBUG"), Conditional("TEST1")>
Sub TraceMethod()
End Sub
[Conditional("DEBUG"), Conditional("TEST1")]
void TraceMethod()
{
// ...
}
[!참고]
규칙에 따라 .NET Framework에서는 특성을 다른 항목과 구분하기 위해 모든 특성 이름 끝에 "Attribute"를 붙입니다.그러나 코드에서 특성을 사용할 때는 접미사 attribute를 지정할 필요가 없습니다.예를 들어, [DllImport]는 [DllImportAttribute]와 같지만 .NET Framework에서 이 특성의 실제 이름은 DllImportAttribute입니다.
특성 매개 변수
대부분의 특성에는 매개 변수가 있으며, 매개 변수는 positional, unnamed 또는 named일 수 있습니다.모든 positional 매개 변수는 일정한 순서로 지정되고 생략할 수 없지만, named 매개 변수는 순서에 관계없이 지정되고 생략할 수도 있습니다.positional 매개 변수는 가장 먼저 지정됩니다.예를 들어, 다음 3개의 특성은 동일합니다.
[DllImport("user32.dll")]
[DllImport("user32.dll", SetLastError=false, ExactSpelling=false)]
[DllImport("user32.dll", ExactSpelling=false, SetLastError=false)]
<DllImport("user32.dll")>
<DllImport("user32.dll", SetLastError:=False, ExactSpelling:=False)>
<DllImport("user32.dll", ExactSpelling:=False, SetLastError:=False)>
DLL 이름인 첫째 매개 변수는 positional이므로 항상 처음에 위치합니다. 그 외의 다른 매개 변수는 named입니다.이 경우 named 매개 변수는 모두 false로 기본 설정되므로 이를 생략할 수 있습니다.기본 매개 변수 값에 대한 자세한 내용은 각 특성과 관련된 설명서를 참조하십시오.
특성 대상
특성의 대상은 특성이 적용되는 엔터티입니다.예를 들어, 클래스, 특정 메서드 또는 전체 어셈블리에 특성이 적용될 수 있습니다.기본적으로 특성 뒤에 오는 요소에 특성이 적용됩니다.그러나 특성이 메서드, 해당 매개 변수 또는 반환 값에 적용되는지를 명시적으로 식별할 수도 있습니다.
특성 대상을 명시적으로 식별하려면 다음 구문을 사용합니다.
[target : attribute-list]
<target : attribute-list>
다음 표에서는 가능한 target 값의 목록을 보여 줍니다.
C# |
Visual Basic |
적용 대상 |
---|---|---|
assembly |
Assembly |
전체 어셈블리 |
module |
Module |
현재 어셈블리 모듈(Visual Basic 모듈과는 다름) |
field |
지원 안 함 |
클래스 또는 구조체의 필드 |
event |
지원 안 함 |
Event |
method |
지원 안 함 |
메서드 또는 get 및 set 속성 접근자 |
param |
지원 안 함 |
메서드 매개 변수 또는 set 속성 접근자 매개 변수 |
property |
지원 안 함 |
Property |
return |
지원 안 함 |
메서드, 속성 인덱서 또는 get 속성 접근자의 반환 값 |
type |
지원 안 함 |
구조체, 클래스, 인터페이스, 열거형 또는 위임 |
다음 예제에서는 어셈블리와 모듈에 특성을 적용하는 방법을 보여 줍니다.자세한 내용은 공통 특성(C# 및 Visual Basic)를 참조하십시오.
Imports System.Reflection
<Assembly: AssemblyTitleAttribute("Production assembly 4"),
Module: CLSCompliant(True)>
using System;
using System.Reflection;
[assembly: AssemblyTitleAttribute("Production assembly 4")]
[module: CLSCompliant(true)]
다음 예제에서는 C#에서 메서드, 메서드 매개 변수 및 메서드 반환 값에 특성을 적용하는 방법을 보여 줍니다.
// default: applies to method
[SomeAttr]
int Method1() { return 0; }
// applies to method
[method: SomeAttr]
int Method2() { return 0; }
// applies to return value
[return: SomeAttr]
int Method3() { return 0; }
[!참고]
SomeAttr이 유효하도록 정의된 대상이 무엇이든 관계없이 SomeAttr이 반환 값에만 적용되도록 정의되었더라도 return 대상을 지정해야 합니다.다시 말하면 컴파일러는 모호한 특성 대상을 결정하기 위해 AttributeUsage 정보를 사용하지 않습니다.자세한 내용은 AttributeUsage(C# 및 Visual Basic)를 참조하십시오.
특성의 일반적인 사용
다음 목록은 코드에서 특성을 사용하는 일반적인 경우를 나타냅니다.
웹 서비스에서 WebMethod 특성으로 메서드를 표시하여 SOAP 프로토콜을 통해 해당 메서드를 호출할 수 있음을 나타냅니다.자세한 내용은 WebMethodAttribute를 참조하십시오.
네이티브 코드와 상호 작용하는 동안 메서드 매개 변수를 마샬링하는 방법을 설명합니다.자세한 내용은 MarshalAsAttribute를 참조하십시오.
클래스, 메서드 및 인터페이스의 COM 속성을 설명합니다.
DllImportAttribute 클래스를 사용하여 비관리 코드를 호출합니다.
어셈블리의 제목, 버전, 설명 또는 상표에 대해 설명합니다.
지속성을 위해 serialize할 클래스의 멤버를 설명합니다.
XML을 serialize하기 위해 클래스 멤버와 XML 노드 사이를 매핑하는 방법을 설명합니다.
메서드에 대한 보안 요구 사항을 설명합니다.
보안을 강제로 적용하는 데 사용되는 특성을 지정합니다.
코드를 디버깅하기 쉬운 상태로 유지하기 위해 JIT(Just-In-Time) 컴파일러에 의한 최적화를 제어합니다.
메서드는 호출자에 대 한 정보를 얻는 중입니다.
관련 단원
자세한 내용은 다음을 참조하십시오.