我正在查看同事的 C# 控制台应用程序,我看到以下代码片段:
class Program
{
static void Main(string[] args)
{
Program p = new Program();
p.RealMain();
}
... non-static RealMain function
}
据推测,他这样做是因为他想要实例级字段等。
我以前没有见过这个,但这种风格让我很烦。 这是一种普遍和公认的做法吗?
有一种思想流派认为面向对象代码的main()函数应该尽可能少地做。Main() 是对过程代码设计的"丑陋"回归,其中程序是在一个函数中编写的,仅在必要时调用子例程。在 OOP 中,所有代码都应封装在对象中,这些对象在被告知时会执行其工作。
因此,通过这样做,您将 main() 入口点中的 LOC 减少到两行,并且程序的实际逻辑以更 O-O 的方式构建和执行。
这对我来说很有意义。
特别是,您可能希望在Main
中添加足够的逻辑来解析命令行参数(可能使用通用参数解析器),然后以适合相关程序的强类型方式将这些选项传递到构造函数中。
阿尔宾问为什么有必要这样做。一言以蔽之:可测试性。在某些情况下,至少通过单元测试或可能的集成测试来测试顶级程序的某些方面是完全可行的。使用实例字段而不是静态字段 (etc) 可以提高此处的可测试性,因为您无需担心以前的测试运行会弄乱状态。
如果你想得到non static functions
你必须这样做。
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(){}
}
从未见过。如果要使用此模式,请使用 RealMain
创建一个单独的 Program2
-类,并改为实例化该类。
为什么需要实例级别字段?静态字段还不够吗?
如果您在内部想要实例化许多Program
类,可能会有一个好处。
我认为这种方法没有任何特别的错误,我只是以前没有见过。
应用程序入口点始终定义为static void Main(...)
。
您可以决定在 Main() 中编写代码或使用此方法运行位于其他地方的其他内容......由您决定...
公认的做法是创建一个单独类的实例,该实例可以包含您需要的任何内容。上面的片段看起来很奇怪,至少:)。
如果它是"程序"以外的任何其他类,这个问题就不会出现。这种设计让你有机会实例化"程序"的多个实例,也许将来是线程化的,所以为什么不呢。我在这里和KeithS在一起:在静态空白Main中尽可能少。
我经常看到这一点,特别是对于快速控制台程序,尝试某些东西或测试某些东西。
Visual Studio实际上鼓励它 - 如果你要求一个新的控制台程序,它会生成一个文件,其中的类只包含一个Main方法。
除非你正在做一些复杂的事情,这需要 1 个以上的类,或者非常简单的事情,根本不需要一个类(即所有方法和变量都是静态的)你为什么不这样做?