다음을 통해 공유


특성(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입니다.

z0w1kczw.collapse_all(ko-kr,VS.110).gif특성 매개 변수

대부분의 특성에는 매개 변수가 있으며, 매개 변수는 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로 기본 설정되므로 이를 생략할 수 있습니다.기본 매개 변수 값에 대한 자세한 내용은 각 특성과 관련된 설명서를 참조하십시오.

z0w1kczw.collapse_all(ko-kr,VS.110).gif특성 대상

특성의 대상은 특성이 적용되는 엔터티입니다.예를 들어, 클래스, 특정 메서드 또는 전체 어셈블리에 특성이 적용될 수 있습니다.기본적으로 특성 뒤에 오는 요소에 특성이 적용됩니다.그러나 특성이 메서드, 해당 매개 변수 또는 반환 값에 적용되는지를 명시적으로 식별할 수도 있습니다.

특성 대상을 명시적으로 식별하려면 다음 구문을 사용합니다.

[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) 컴파일러에 의한 최적화를 제어합니다.

  • 메서드는 호출자에 대 한 정보를 얻는 중입니다.

관련 단원

자세한 내용은 다음을 참조하십시오.

참고 항목

참조

리플렉션(C# 및 Visual Basic)

개념

C# 프로그래밍 가이드

기타 리소스

Visual Basic 프로그래밍 가이드

특성을 사용하여 메타데이터 확장