2010-03-04 4 views
4

특성에 대해 읽었으며 코드와 함께 다른 대상 엔터티에 적용 할 수 있음을 이해했습니다 (Attribute Targets 참조).C# 특성 및 특성 위치/대상

그래서, AssemblyInfo.cs에 내 프로젝트에 파일을보고, 나는 다음 볼 수 있습니다 : 나에게 의미가

[assembly: AssemblyTitle("AttributesDemo")] 
[assembly: AssemblyDescription("")] 

합니다. 대상이 어셈블리 인 특성입니다.

[MyAttribute] 
class MySerialzableClass 
{ 

MyAttribute 존재로 : 다음과 같이 I 클래스에 속성을 추가 할 수 있습니다 내 코드에서

그래서

[AttributeUsage (AttributeTargets.All)] 
public class MyAttribute : System.Attribute 
{ 
} 

, 나는 첫 번째 코드에서 assembly: 문에 대한 생각에 도착 블록. 그리고 단지 실험을 위해,이 시도 :

'클래스'인식 할 수없는 속성 위치 :

[class: MyAttribute] 
class MySerialzableClass 
{ 

이 컴파일러 경고를 제공합니다. 이 블록 의 모든 속성은 무시됩니다.

내 질문은 - 왜 일부 속성에서 속성 대상을 지정해야하며 다른 사람에게 요청되거나 허용되지 않는 이유는 무엇입니까? 게다가, 당신은 이것을해야합니까?

답변

5

대상이 코드에 표시되지 않은 경우 명시 적으로 대상을 지정해야합니다.

클래스를 지정 클래스
[return: MyAttribute] 
public static int meth(

: 과도한, 컴파일러는 당신이

+0

+1. –

+0

+1 그리고 받아 들여진 대답, 'ReturnValue :'이 아니라 'Return :'이 아니어야합니다. –

+0

아니오 :) 단지 작성하고 컴파일하려고합니다. – Andrey

3

일반적으로 속성은 클래스 또는 메서드와 같은 영향을 받기 직전에 제공됩니다. 어셈블리 와이드 속성의 경우 "이전"이 없으므로이를 지정해야합니다.

4

당신은하지만, 모든 속성 사용에 대한 attribute targets을 지정할 수 있습니다 의미 않는 것을 이해할 수 난 단지 세 가지 목표, 조립, 모듈 및 반환이 알고 기본값 (assemblymodule)이없는 것은 필수입니다. 또한 은 기본이 아닌 대상에 속성을 적용 할 때이 주석을 사용해야합니다. 비 기본 목표

예 :하여 예에서

[return: MyAttribute] 
public int Method() { ... } 

public int Property { 
    get; 
    [param: MyAttribute] // applies to the parameter to the setter 
    set; 
} 

는 (기본값) 오른쪽 대상 type 경우 : * 다른 * 예외 언급위한

[type: MyAttribute] 
class MySerialzableClass { } 
+1

이것은 올바른 타겟 키워드'type :'을 제공하기 때문에 가장 좋은 대답입니다.가능한 전역 타겟은'assembly'와'module'이고, non-global target은'field','event','method','param','property','return' 및'type'입니다. –