2015-02-05 1 views
1

그래서 CallerMemberName 속성을 속성의 생성자 매개 변수에 적용하면 어떻게되는지 궁금합니다. 여기에 아주 간단한 코드가 있습니다.속성 생성자가 console.writeline을 사용할 수 없습니다.

class MyAttribute : Attribute 
{ 
    public MyAttribute(string message, [CallerMemberName] string name = "none specified") 
    { 
     Console.WriteLine("\{message}: \{name}"); 
    } 
} 
[My("Program")] 
class Program 
{ 
    [My("Main")] 
    static void Main(string[] args) 
    { 
     var MyAttribute = new MyAttribute("Inner"); 
     Console.ReadLine(); 
    } 
} 

코드를 실행했지만 아무런 변화가 없습니다. 따라서 생성자에 중단 점을 넣어 충돌이 발생하는지 확인합니다. 그것은 정말로했다. 그러나, Writeline 호출이 실행중인 것 같지만 아무 것도 나타나지 않습니다. 왜 안돼?

또한 [My ("Program")] 속성에 대한 중단 점에 도달하지 못했습니다. 왜 안돼?

편집 : SLaks의 답변에 따르면 경쟁 조건이 프로그램에 치명적일 수 있습니다. 나는에 생성자의 내부를 변경 :

new Thread(() => 
{ 
    Thread.Sleep(1000); 
    Console.WriteLine("\{message}: \{name}"); 
}).Start(); 

메인 및 내부 속성은이 방법을 인쇄 할 수 있지만, 프로그램 속성은하지 않습니다. 왜 그런가요?

답변

6

이것은 CLR 로더의 버그입니다. 당신이 활성화 VS 호스팅 프로세스로 실행하고 Main() 기능, 또는 (IIRC)를 포함하는 클래스에 적용되는 속성의 생성자에서 Console.WriteLine()를 호출 할 경우

, 당신은 Console에 재진입 경쟁 조건을 트리거, 그리고 것 Console은 해당 프로그램의 수명 동안 완전히 손상됩니다.

하지 마십시오.

+0

나는 본다. 확장 질문에 대한 편집을 참조하십시오. – phil

+1

@phil : 속성 생성자는 누군가가 속성을 가져 오지 않는 한 실행되지 않습니다. – SLaks

+0

'Main()'이 그 속성을 가지고 있기 때문에 왜 속성 생성자 본문이 실행됩니까? 당신이 묘사하는 상황을 이해하지 못합니다. –

관련 문제