다음을 통해 공유


특성 대상(C++ 구성 요소 확장)

특성 사용 지정자를 사용하여 특성 대상을 지정할 수 있습니다. 각 특성이 정의되어 특정 언어 요소에 적용합니다. 예를 들어, 특성 클래스 및 구조체에만 적용 되도록 정의됩니다. 사용자 지정 특성을 사용할 수 있는 구문 요소는 다음과 같습니다. 이러한 값의 (논리를 사용하거나) 조합을 사용할 수 있습니다.

특성을 정의할 때 AttributeUsageAttribute에 하나 이상의 AttributeTargets 열거자를 전달하는 특성 대상을 지정 하려면.

다음은 유효한 특성 대상 목록입니다.

대상

샘플 사용

모두

(모든 구문에 적용)

// attribute_targets_all.cpp
// compile with: /clr /c
using namespace System;
[AttributeUsage(AttributeTargets::All)]
ref class Attr : public Attribute {};
[assembly:Attr];

어셈블리

(전체 어셈블리에 적용)

// attribute_targets_assembly.cpp
// compile with: /clr /c
using namespace System;
[AttributeUsage(AttributeTargets::Assembly)]
ref class Attr : public Attribute {};
[assembly:Attr];

Module

(전체 모듈에 적용)

// attribute_targets_module.cpp
// compile with: /clr /c
using namespace System;
[AttributeUsage(AttributeTargets::Module)]
ref class Attr : public Attribute {};
[module:Attr];

클래스

// attribute_targets_class.cpp
// compile with: /clr /c
using namespace System;
[AttributeUsage(AttributeTargets::Class)]
ref class Attr : public System::Attribute {};
[Attr]   // same as [class:Attr]
ref class MyClass {};

구조체

// attribute_targets_struct.cpp
// compile with: /clr /c
using namespace System;
[AttributeUsage(AttributeTargets::Struct)]
ref class Attr : public Attribute {};
[Attr]   // same as [struct:Attr]
value struct MyStruct{};

enum

// attribute_targets_enum.cpp
// compile with: /clr /c
using namespace System;
[AttributeUsage(AttributeTargets::Enum)]
ref class Attr : public Attribute {};
[Attr]   // same as [enum:Attr]
enum struct MyEnum{e, d};

생성자

// attribute_targets_constructor.cpp
// compile with: /clr /c
using namespace System;
[AttributeUsage(AttributeTargets::Constructor)]
ref class Attr : public Attribute {};
ref struct MyStruct{
   [Attr] MyStruct(){}   // same as [constructor:Attr]
};

메서드

// attribute_targets_method.cpp
// compile with: /clr /c
using namespace System;
[AttributeUsage(AttributeTargets::Method)]
ref class Attr : public Attribute {};
ref struct MyStruct{
   [Attr] void Test(){}   // same as [method:Attr]
};

Property

// attribute_targets_property.cpp
// compile with: /clr /c
using namespace System;
[AttributeUsage(AttributeTargets::Property)]
ref class Attr : public Attribute {};
ref struct MyStruct{
   [Attr] property int Test;   // same as [property:Attr]
};

필드

// attribute_targets_field.cpp
// compile with: /clr /c
using namespace System;
[AttributeUsage(AttributeTargets::Field)]
ref class Attr : public Attribute {};
ref struct MyStruct{
   [Attr] int Test;   // same as [field:Attr]
};

Event

// attribute_targets_event.cpp
// compile with: /clr /c
using namespace System;
[AttributeUsage(AttributeTargets::Event)]
ref class Attr : public Attribute {};
delegate void ClickEventHandler(int, double);
ref struct MyStruct{
   [Attr] event ClickEventHandler^ OnClick;   // same as [event:Attr]
};

인터페이스

// attribute_targets_interface.cpp
// compile with: /clr /c
using namespace System;
[AttributeUsage(AttributeTargets::Interface)]
ref class Attr : public Attribute {};
[Attr]   // same as [event:Attr]
interface struct MyStruct{};

Parameter

// attribute_targets_parameter.cpp
// compile with: /clr /c
using namespace System;
[AttributeUsage(AttributeTargets::Parameter)]
ref class Attr : public Attribute {};
ref struct MyStruct{
   void Test([Attr] int i);
   void Test2([parameter:Attr] int i);
};

대리자

// attribute_targets_delegate.cpp
// compile with: /clr /c
using namespace System;
[AttributeUsage(AttributeTargets::Delegate)]
ref class Attr : public Attribute {};
[Attr] delegate void Test();
[delegate:Attr] delegate void Test2();

반환 값

// attribute_targets_returnvalue.cpp
// compile with: /clr /c
using namespace System;
[AttributeUsage(AttributeTargets::ReturnValue)]
ref class Attr : public Attribute {};
ref struct MyStruct {
   // Note required specifier
   [returnvalue:Attr] int Test() { return 0; }
};

일반적으로, 속성은 바로이 적용되는 언어 요소 앞에옵니다. 그러나 일부의 경우, 특성의 위치 특성의 의도 된 타겟을 결정하기에 충분하지 않습니다. 다음 예제를 고려해 보십시오.

[Attr] int MyFn(double x)...

구문 적 특성 (메서드의경우는 디폴트) 메소드나 메소드의 리턴 값을 적용하도록 구성되어있는 경우 확인할 방법이 없습니다. 이러한 경우, 사용 특성 지정자를 사용할 수 있습니다. 예를 들어, returnvalue 지정자를 사용하여 다음과 같이 특성을 반환 갑셍 적용할 수 있습니다 :

[returnvalue:Attr] int MyFn(double x)... // applies to return value

특성 지정자는 다음과 같은 경우에 필요한 사용됩니다.

  • 어셈블리 또는 모듈 수준 특성을 지정합니다.

  • 속성이 메서드의 반환 값이 아닌 방법에 적용하도록 지정하려면 :

    [method:Attr] int MyFn(double x)...     // Attr applies to method
    [returnvalue:Attr] int MyFn(double x)...// Attr applies to return value
    [Attr] int MyFn(double x)...            // default: method
    
  • 하는 특성 속성이 아닌 속성의 접근자에 적용 되도록 지정합니다.

    [method:MyAttr(123)] property int Property()  
    [property:MyAttr(123)] property int Property()
    [MyAttr(123)] property int get_MyPropy() // default: property
    
  • 특성 이벤트가 아니라 이벤트의 접근자에 적용 되도록 지정합니다.

    delegate void MyDel();
    ref struct X {
       [field:MyAttr(123)] event MyDel* MyEvent;   //field
       [event:MyAttr(123)] event MyDel* MyEvent;   //event
       [MyAttr(123)] event MyDel* MyEvent;   // default: event
    }
    

특성 지정자 사용. 바로 뒤에 있는 특성에만 적용됩니다. 즉,

[returnvalue:Attr1, Attr2]

다른

[returnvalue:Attr1, returnvalue:Attr2]

예제

설명

이 샘플에서는 여러 대상을 지정하는 방법을 보여줍니다.

코드

// attribute_targets.cpp
// compile with: /clr /c
using namespace System;
[AttributeUsage(AttributeTargets::Class | AttributeTargets::Struct, AllowMultiple = true )]
ref struct Attr : public Attribute {
   Attr(bool i){}
   Attr(){}
};

[Attr]
ref class MyClass {};

[Attr]
[Attr(true)]
value struct MyStruct {};

참고 항목

참조

사용자 정의 특성(C++ 구성 요소 확장)