属性构造函数不能使用console.writeline

时间:2015-02-05 21:06:18

标签: c# custom-attributes

所以我很好奇如果我将CallerMemberName属性应用于Attribute的构造函数的参数会发生什么。这是我非常简单的代码。

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();

Main和Inner属性以这种方式打印,但Program属性不打印。那是为什么?

1 个答案:

答案 0 :(得分:6)

这是CLR加载程序中的一个错误。

如果您在启用VS主机进程的情况下运行并在应用于Console.WriteLine()函数的属性的构造函数中调用Main(),或者(IIRC)包含它的类,则会触发重入竞争Console中的条件,Console将在该程序的生命周期内完全中断。

不要那样做。