C#由自定义属性修饰的主方法

时间:2014-02-22 04:01:08

标签: c# attributes

当我通过自定义 Attribute 装饰我的Main方法时遇到了一件奇怪的事情:

class Program
{
    [Attr]
    static void Main(string[] args)
    {
        Console.WriteLine("Main end..");
        Console.Read();
    }
}

class AttrAttribute : Attribute
{
    public AttrAttribute()
    {
        Console.WriteLine("Hello world!");
    }
}

然后控制台程序不会打印任何内容。但是当我调试程序时,我发现属性AttrAttribute的构造函数和Main方法确实都已执行。任何人都可以告诉我为什么..

如果我评论'Console.WriteLine(“Hello world!”);'在AttrAttribute的构造函数中,程序打印“Main end ..”..

谢谢大家。 (抱歉我的英语池。)

1 个答案:

答案 0 :(得分:1)

首先,明确的事情是你必须明白,当Type类调用GetCustomAttributes()时,会创建属性。话虽如此,有意义的是你的属性构造函数中的Console.WriteLine没有显示 - 你的程序尚未“正式”启动,因为它还没有输入Main(...)

现在,当我运行代码并测试它时,我发现了两件事。

  1. 当我使用调试器运行时,我遇到了问题。 Console.WriteLine永远不会写入控制台。
  2. 在没有调试器的情况下运行时出现问题。
  3. 当我使用调试器运行并且属性的构造函数命中时,我可以在调试屏幕中看到Console它已重定向所有输出/输入。当我单步执行并输入Main()时,控制台仍在重定向。

    在属性的构造函数中注释掉Console.WriteLine会导致Console在进入Main()后重置。这让我相信在程序“正式”启动之前调用Console.WriteLine会导致控制台锁定到位并且不会重新初始化。

    现在这只是一个猜测,但我怀疑Visual Studio在应用程序实例中捕获Console,无论它在启动应用程序之前是否需要它。之前访问它,标记它不重置/重新初始化。