2012-02-06 2 views
12

특성은 실제로 어셈블리에 연결된 메타 데이터이므로 속성 개체는 요청시에만 생성됩니다 (예 : GetCustomAttributes를 호출 할 때)?애트리뷰트 개체는 언제 만들어 집니까?

또는 개체를 만들 때 만들어 졌습니까?

또는 CLR에 의한 속성 검색으로 인해 개체가 만들어 질 때 생성되는 처음 2의 조합?

+0

[.NET 특성 : GetCustomAttributes()가 매번 새 특성 인스턴스를 만드는 이유는 무엇입니까?] (http://stackoverflow.com/q/417275/319403). 귀하의 질문에 답할 수도 있습니다. – cHao

+0

그것은 방법으로했다. 실제 질문은 내게 정말로 문제가 아니었지만 중간에 대답이 왔습니다. @Smi를 통해) CLR 도서의 성서도 가지고있는 것이 좋습니다. – Dann

답변

8

CLR에서 C를 통해 #, 세 번째 버전은 : 당신이 속성 객체를 생성하려면

, 당신은 호출해야 하나 GetCustomAttributes 또는 GetCustomAttribute. 이러한 메소드 중 하나가 호출 될 때마다 지정된 속성 유형의 새 인스턴스 을 생성하고 소스 코드에 지정된 값을 기반으로 인스턴스의 각 필드와 속성을 설정합니다. 이러한 메서드는 적용된 특성 클래스의 완전히 구성된 인스턴스에 대한 참조를 반환합니다.

예, 요청시에만 생성됩니다.

4

요청에 따라 생성됩니다.

예를 들어 .NET 3.0 특성을 .NET 2.0 어셈블리 (예 : WCF DataContractAttribute)에 추가하면 .NET이없는 컴퓨터에서 .NET 2.0 어셈블리를 계속 사용할 수 있습니다 3.0이 설치되어 있어야합니다 (속성에 액세스하려고 시도하는 코드가없는 경우).

2

아주 깨끗하지는 않지만 속성도 코드 생성에 영향을줍니다. 일부 특성은 컴파일러, 예를 들어 [DllImport]에 의해 해석됩니다. 일부는 지터 ​​(예 : [MethodImpl])에 의해 발견됩니다. 이것은 속성을 이용하기 위해 작성된 프레임 워크의 다른 도구와 클래스로 무한히 확장됩니다.

그러나 이러한 도구는 자신의 특성을 찾으려는 경우 수행해야하는 작업이므로 GetCustomAttributes()를 호출해야합니다. 이러한 종류의 코드는 객체의 인스턴스와 관련이 없으며 속성은 유형에 적용됩니다.

+0

그래서 시스템에 속한 속성 ("DllImport")은 메타 데이터로 유지되고 객체가 생성되고 활용되는 대신 파싱됩니다. – Dann

+1

실제로 속성을 사용하여 수행하는 도구가 여기 저기에 있습니다. –

관련 문제