在C#控制台应用程序中,public static void Main()和private static void Main()有什么区别?

51

什么是区别?

public static void Main()

private static void Main()

在一个C#控制台应用程序中如何使用Main()方法?特别是与publicprivate的区别有关的部分我已经了解。


不是答案,但请注意,微软强烈建议您不要将Main()设为public(部分原因是这没有什么意义)。 - Michael Edenfield
1
我会主张使用 public。因为从概念上讲,操作系统是从类的外部调用它,所以不应该使用 "private"。我们中有些人还反对将主函数作为方法,但这是另一个问题。 - geometrian
10个回答

63
作为应用程序的起始点,Main方法不需要是public。如果您决定将其设置为public,则其他类或程序集可以从中调用。通常情况下,您不需要这样做,因此可以将其保留为private
使它成为public的一种可能的用例是允许自动化测试调用它。

2
附注:创建一个空的控制台应用程序将导致默认为内部类可见性的“class Program”。因此,除了“Main”方法之外,甚至类本身也不需要是公共的。 - Caramiriel

22
两者的区别仅在于 publicprivate 访问修饰符之间,因为两者都是有效的。它完全取决于应用程序的使用方式来决定使用哪一个。
如果您想通过任何外部程序初始化入口点(即用作 API,进行测试),则可能需要将其设置为公共,以便可以访问。

public

如果您知道该应用程序没有外部使用,则最好将其设置为私有,以便没有外部应用程序可以访问它。

private


2
通过使用反射,您可以轻松获取其他类的私有方法和字段。 - Sarp Kaya
9
反射是否破坏了私有方法的理念,因为私有方法可以在类外部访问? - Zaheer Ahmed
10
“private”的意思是告诉你它不可用/你不应该调用它。虽然可以通过反射等方法绕过这一限制,但这并不改变其本质。 - M. Mimpen
6
封装不等于安全。 - Engineer2021
1
@mikek3332002:可执行文件定义了一个入口点。这个入口点是由编译器在编译时设置的。它将被设置为您在项目属性中选择的方法的地址。然后,.NET调用GetCorExeMainEntrypoint()来查找它。 - Thomas Weller
显示剩余8条评论

10

对于大多数目的,这不会有任何影响。 Microsoft 倡导将 Main 方法设置为私有。

做这件事情的唯一实际价值(就我所知)是可以防止其他应用程序代码库直接调用 Main 方法。

关于此有一个很好的讨论,可以在这里找到。


6

4

3

这两个变量是不同的,因为第一个是公有的,而第二个是私有的。所以,当你尝试从类外部使用第一个变量时,它可以正常工作,但是对于第二个变量则不行。

但是,如果你尝试将其中一个变量作为应用程序的入口点,就没有区别了。 入口点方法可以是公有的或私有的,这并不重要。


2

public和private是访问修饰符。

我们使用,

 public static void Main()

因为要执行程序,你需要调用包含这个Main()方法的类,在那之前,你需要将你的Main()方法设置为public,否则它将无法在类外部访问。

而它被设置为static的原因是,因为它需要在不创建该类任何对象的情况下被访问,也就是在类级别上。


2
私有或公有声明是访问修饰符,私有访问修饰符使其对外部对象不可访问,而公共访问修饰符使其对外部对象可访问。例如用法:
假设我们有一个类:
class myClass{
    public void test(){
        //do something
    }
}

我们创建该类的一个实例:
myClass mClass=new myClass();

要访问它的成员函数,您需要执行以下操作:

mClass.test();

如果它有私有访问修饰符,你会得到一个编译错误,说它是不可访问的。
只是为了增加知识,要想在不创建类实例的情况下访问成员,你也需要将该成员设置为静态的,例如:
class myClass{
    public static void test(){
        //do something
    }
}

现在要访问它,您只需要简单地执行以下操作:

myClass.test();

(注意,任何在静态成员中访问的成员也应该是静态的)

1
基于访问级别。
private--> access to own class
public --> open to alll

1
例如,当您想要添加可以从类或程序集外部调用的入口点时,应设置public,但如果不重要,则使用private

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接