Так что мне было любопытно, что произойдет, если я применил атрибут 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();
Главные и внутренние атрибуты делают печать таким образом, но атрибут Программы не делает. Почему это?
Я вижу. См. Edit для расширенного вопроса. – phil
@phil: Конструкторы атрибутов не запускаются, если кто-то не получает атрибут. – SLaks
Почему тело конструктора атрибутов всегда запускается только потому, что 'Main()' несет этот атрибут? Я не понимаю ситуацию, которую вы описываете. –