包含Main方法的类的含义

时间:2013-04-08 13:58:46

标签: c#

如果在静态或非静态类中定义了Main方法,或者该类是否公开且Main方法是否公开?

是否有任何区别?

5 个答案:

答案 0 :(得分:7)

没有。唯一的条件是它不能是泛型类型。从C#4规范的3.1节开始:

  

应用程序入口点可能不在泛型类声明中。

我怀疑这也是为了包含泛型结构声明,因为它们会以同样的方式失败。 (CLR不知道要提供什么类型的参数。)

入口点类型可以嵌套,静态,任何可访问性等等。方法本身也可以是私有的,只要它具有适当的返回类型(voidint)和适当的参数(无或string[]) - 当然它必须是静态的。

答案 1 :(得分:3)

不,这根本不重要。

答案 2 :(得分:3)

根据MSDN

  

Main在类或结构中声明。主必须是静态的,不应该是公开的。 (...)封闭的类或结构不需要是静态的。

不完全清楚为什么它不应该是公开的。 (在Java中,必须是公开的)

类/结构的可访问性并不重要。

答案 3 :(得分:2)

CLR实际上并不介意您的方法是私有还是公开。它不会通过使用普通的C#代码来调用它。阅读更多here

答案 4 :(得分:1)

.NET的一个奇怪元素使得Main函数的安全性实际上非常重要。

在.NET语言中,您可以将可执行文件链接为库!这意味着如果在ConsoleApplication4中定义完整的程序:

    namespace ConsoleApplication4
    {
        public class Program
        {
            public static int Foo(int a, int b)
            {
                return a + b;
            }
            public static void Main(string[] args)
            {

            }
        }
    }

然后我可以在另一个项目中为ConsoleApplication4做一个引用,并执行以下操作:

    namespace UsedExecutableAsLibrary
    {
        class Program
        {
            static void Main(string[] args)
            {
                ConsoleApplication4.Program.Foo(10, 20);
                ConsoleApplication4.Program.Main(args);
            }
        }
    }

但是,如果我将ConsoleApplication4.Program私有或Program中的任何函数设为私有,则在编译后将无法再访问它们。你想要哪种行为完全取决于你,但通常你想隐藏你的程序的多汁部分,所以你做主要私人。