그래서 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();
메인 및 내부 속성은이 방법을 인쇄 할 수 있지만, 프로그램 속성은하지 않습니다. 왜 그런가요?
나는 본다. 확장 질문에 대한 편집을 참조하십시오. – phil
@phil : 속성 생성자는 누군가가 속성을 가져 오지 않는 한 실행되지 않습니다. – SLaks
'Main()'이 그 속성을 가지고 있기 때문에 왜 속성 생성자 본문이 실행됩니까? 당신이 묘사하는 상황을 이해하지 못합니다. –