属性构造函数不能使用 console.writeline
Attribute constructor can't use console.writeline
所以我很好奇如果我将 CallerMemberName 属性应用于属性的构造函数的参数会发生什么。这是我非常简单的代码。
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 属性不会。这是为什么?
这是 CLR 加载程序中的错误。
如果您 运行 启用了 VS 托管进程并在应用于 Main()
函数的属性的构造函数中调用 Console.WriteLine()
,或者 (IIRC) class 包含它,您将在 Console
中触发重入竞争条件,并且 Console
将在该程序的生命周期内被完全破坏。
不要那样做。
所以我很好奇如果我将 CallerMemberName 属性应用于属性的构造函数的参数会发生什么。这是我非常简单的代码。
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 属性不会。这是为什么?
这是 CLR 加载程序中的错误。
如果您 运行 启用了 VS 托管进程并在应用于 Main()
函数的属性的构造函数中调用 Console.WriteLine()
,或者 (IIRC) class 包含它,您将在 Console
中触发重入竞争条件,并且 Console
将在该程序的生命周期内被完全破坏。
不要那样做。