phi*_*hil 1 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();
}
}
Run Code Online (Sandbox Code Playgroud)
我运行代码,什么也没发生.所以我在构造函数中放置了一个断点,看它是否会被击中.确实如此.但是,即使Writeline调用似乎正在执行,也没有任何东西出现.为什么不?
此外,断点没有被[My("Program")]属性命中.为什么不?
编辑:根据SLaks的回答,有一个竞争条件对该计划可能是致命的.我将构造函数的内部更改为:
new Thread(() =>
{
Thread.Sleep(1000);
Console.WriteLine("\{message}: \{name}");
}).Start();
Run Code Online (Sandbox Code Playgroud)
Main和Inner属性以这种方式打印,但Program属性不打印.这是为什么?
这是CLR加载程序中的错误.
如果在启用VS主机进程的情况下运行并Console.WriteLine()在应用于该Main()函数的属性的构造函数中调用,或者(IIRC)包含它的类,则将触发重入竞争条件Console,并且Console将在生命周期内完全中断该计划.
不要那样做.