C# 实例化包含静态void Main()的类

C# 实例化包含静态void Main()的类,c#,static,console-application,instance,main,C#,Static,Console Application,Instance,Main,我正在查看一位同事的C#控制台应用程序,我看到了以下片段: class Program { static void Main(string[] args) { Program p = new Program(); p.RealMain(); } ... non-static RealMain function } 他这样做大概是因为他想要实例级字段,等等 我以前没见过这个,但这种风格让我讨厌。这是一种常见且公认的做法吗?以前从未

我正在查看一位同事的C#控制台应用程序,我看到了以下片段:

class Program
{
    static void Main(string[] args)
    {
        Program p = new Program();
        p.RealMain();
    }

    ... non-static RealMain function
}
他这样做大概是因为他想要实例级字段,等等


我以前没见过这个,但这种风格让我讨厌。这是一种常见且公认的做法吗?

以前从未见过。如果要使用此模式,请使用
RealMain
创建一个单独的
Program2
-类,并将其实例化


为什么需要实例级字段?静态字段还不够吗

如果您想在内部实例化许多
程序
类,这可能会有好处


我不认为这种方法有什么特别的错误,我只是以前没有见过。

应用程序入口点总是定义为
静态void Main(…)


您可以决定在Main()中编写代码,或使用此方法运行位于其他位置的其他程序。。。这取决于您决定……

如果您想获得
非静态函数,您必须这样做

class Program
{
    static void Main(string[] args)
    {
        Program p = new Program(); // dependency of the class will be there.So not a good practice
        p.RealMain();// if you want initalize, you have to go like this or better you can do it in some other class.
    }

    void RealMain(){} 
}

有一种学派认为,面向对象代码的main()函数应该尽可能少地执行。Main()是对过程代码设计的一种“丑陋”的回溯,程序是在一个函数中编写的,只在必要时调用子例程。在OOP中,所有代码都应该封装在对象中,这些对象在被告知时执行它们的任务


因此,通过这样做,您可以将main()入口点中的LOC减少到两行,程序的真正逻辑将以更O-O的方式构造和执行。

如果它是除“program”之外的任何其他类,那么问题就不会出现了。这种设计使您有机会实例化“程序”的多个实例,将来可能是线程化的,为什么不呢。我支持KeithS的观点:在静态void Main中尽可能少地创建实例。

公认的做法是创建一个单独类的实例,该类可以包含您需要的任何内容。上面的代码片段看起来很奇怪,至少:)。

对我来说很有意义

特别是,您可能希望在
Main
中添加足够的逻辑来解析命令行参数(可能使用通用参数解析器),然后以适合所讨论程序的强类型方式将这些选项传递给构造函数


阿尔宾问为什么这是必要的。一句话:可测试性。在某些情况下,至少可以通过单元测试或可能的集成测试来测试顶级程序的某些方面。使用实例字段而不是静态字段(etc)可以提高可测试性,因为您不必担心以前的测试运行会弄乱状态。

我经常看到这一点,特别是对于快速控制台程序来说,为了尝试一些东西或测试一些东西

VisualStudio实际上鼓励这样做——如果您要求一个新的控制台程序,它会生成一个文件,其中一个类只包含一个Main方法

除非你正在做一些复杂的事情,需要不止一个类,或者非常简单的事情,根本不需要一个类(即所有的方法和变量都是静态的)
你为什么不这样做?

这有什么问题?你对实例变量有什么看法?你从不使用它们吗?我觉得很奇怪,但我不能权威地告诉你它是普通的还是好的。@David Heffernan--我没有任何有力的理由支持或反对这一点(就像@ThatMatthew)。只是静态字段同样易于使用,而且您不必实例化外部类。@David Heffernan他通常对实例变量没有问题。他在实例化一个通常只用于调用静态方法的类时遇到了问题。到底是谁接受的?有任何引用吗?@Jon Skeet所说的“accepted”我的意思是这种做法几乎在任何地方都使用,Main方法通常作为应用程序本身的入口点,例如在Windows应用程序中,首先实例化一个窗体,然后调用“real”入口点方法-Show.@Centro:这实际上取决于您在做什么。对于小型工具,我通常只有一个类——不管它是否实例化。我不认为拥有两个类而不是一个类有任何好处,只是为了避免在同一个类中拥有
Main
。@Jon Skeet对于小型应用程序可能有意义,但对于现实世界的应用程序,主方法必须尽可能清晰。@Centro:你为什么认为现实世界的应用程序不能是小型的?我已经写了很多小工具,它们在现实世界中非常常用。当然,很大一部分应用程序根本没有
Main
方法——它们是web应用程序或web服务或其他什么。“为什么需要实例级字段?静态字段不够吗?”——问得好。我想我得问问开发人员,但我很难想象这样的情况会保证程序的多个实例都有自己的非静态字段。这只是一个控制台应用程序。所以当你自己编写控制台应用程序时,你就是这么做的吗?@anonymous:有时候,是的。这完全取决于情况,但我肯定认为这是有意义的,特别是如果它保持测试更干净的话。项目越小,它就越有意义-如果你的项目只包含几个类,那么在我看来,为Main多设置一个类是不必要的。那么,当你自己编写控制台应用程序时,你就是这么做的吗?不是。我没有说我订阅了那个学派:)