2015-02-05 2 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, похоже, выполняется, ничего не появляется. Почему нет?

Кроме того, точка останова не попала в атрибут [Мой ("Программа")]. Почему нет?

EDIT: Согласно ответу SLaks, состояние гонки может быть фатальным для программы. я изменил внутреннюю часть конструкторы:

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

Главные и внутренние атрибуты делают печать таким образом, но атрибут Программы не делает. Почему это?

ответ

6

Это ошибка в загрузчике CLR.

Если вы работаете с процессом хостинг VS включен и вызвать Console.WriteLine() в конструкторе атрибута применяется к функции Main(), или (IIRC) класса, содержащего его, вы будете вызывать состояние Реентерабельность гонки в Console, и Console будет полностью разбит на всю жизнь этой программы.

Не делайте этого.

+0

Я вижу. См. Edit для расширенного вопроса. – phil

+1

@phil: Конструкторы атрибутов не запускаются, если кто-то не получает атрибут. – SLaks

+0

Почему тело конструктора атрибутов всегда запускается только потому, что 'Main()' несет этот атрибут? Я не понимаю ситуацию, которую вы описываете. –

Смежные вопросы