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