所以我很好奇如果我将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属性不打印。那是为什么?
答案 0 :(得分:6)
这是CLR加载程序中的一个错误。
如果您在启用VS主机进程的情况下运行并在应用于Console.WriteLine()
函数的属性的构造函数中调用Main()
,或者(IIRC)包含它的类,则会触发重入竞争Console
中的条件,Console
将在该程序的生命周期内完全中断。
不要那样做。