0

如果Main方法是在静态或非静态类中定义的,或者该类是否是公共的,以及Main方法是否是公共的,有什么区别吗?

4

5 回答 5

7

不,唯一的条件是它不能是泛型类型。从 C# 4 规范的第 3.1 节:

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

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

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

于 2013-04-08T13:59:49.807 回答
3

不,这根本不重要。

于 2013-04-08T13:59:32.897 回答
3

根据MSDN

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

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

类/结构的可访问性无关紧要。

于 2013-04-08T14:01:16.813 回答
2

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

于 2013-04-08T14:04:23.160 回答
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设为私有,则它们在编译后将不再可访问。您想要哪种行为完全取决于您,但通常您希望对其他人隐藏程序的有趣部分,因此您将 main 设为私有。

于 2013-04-08T14:14:24.817 回答