c#属性超过主

前端之家收集整理的这篇文章主要介绍了c#属性超过主前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
有人问我有关如何打印的问题
line no 1
line no 2
line no 3

没有改变读取的主要方法

static void Main(string[] args)
{
    Console.WriteLine("line no 2");
}

现在一种方法是为控制台应用程序提供多个入口点.但是我尝试了另一种方法,如下:

class Program
{
    [Some]
    static void Main(string[] args)
    {
        Console.WriteLine("line no 2");
    }
}
class SomeAttribute : Attribute
{
    public SomeAttribute()
    {
        Console.WriteLine("line no 1");
    }
    ~SomeAttribute()
    {
        Console.WriteLine("line no 3");
    }
}

当我在每一个WriteLine上应用一个断点时,我可以看到这个方法有效,但是在控制台上也没有反映出来.

只是好奇.

解决方法

你的问题可以分解成搜索钩子,这是在控制台应用程序的Main方法执行之前和之后触发的.

>第一个钩子是一个程序静态构造函数,它是在程序类中的Main方法之前执行的guarantee.
>第二个是AppDomain的事件ProcessExit,“当默认应用程序域的父进程退出时发生”.您可以使用静态构造函数订阅此事件.

class Program
{
    static Program()
    {
        Console.WriteLine("line no 1");

        AppDomain.CurrentDomain.ProcessExit += 
                                          (s,a) => Console.WriteLine("line no 3");
    }

    static void Main(string[] args)
    {
        Console.WriteLine("line no 2");
    }
}

打印:

line no 1
line no 2
line no 3

下一部分将是相当长的一个.我会尝试解释你的问题中SomeAttribute的问题.

首先,考虑这个StackOverflow问题才能正确地知道when custom attributes constructors are executed.这不是那么简单,因为它可能看起来乍一看.

正如我们已经知道的那样,定制属性的ctor只会被执行,当你将通过反射访问它.所以在你的例子中,简单的程序执行将不会触发属性构造函数.但是,当您将SomeAttribute应用于Main方法时,为什么会断点?事实证明,视觉工作室使用反射来找出主要方法,并将调试器附加到您的应用程序.但是在这一点上没有控制台窗口.所以声明Console.WriteLine是无用的并产生影响.此外,它似乎阻止了控制台输出的所有下一个语句.

所以下一个代码将产生不同的结果,这取决于你是否使用VS调试器运行它:

class Program
{
    [MyAttribute]
    static void Main()
    {

    }
}

class MyAttribute : Attribute
{
    public MyAttribute()
    {
        MessageBox.Show("MyAttribute ctor");
    } 
}

如果您运行它没有调试器(Ctrl F5在VS默认配置),你会看到,程序终止,没有窗口出现.当您使用调试器(F5)执行它时,您将看到

而VS旁边没有控制台窗口,只有win窗体图标:

如前所述,当您没有人尝试写入控制台时,所有其他对Console.WriteLine的调用不会影响您的控制台应用程序.这就是为什么您可以看到任何控制台消息,即使您在构造函数中执行断点.

猜你在找的C#相关文章