C# Main()方法的默认访问修饰符是什么?

10

我在VS2010中创建了一个示例类。

通过“类视图”,我看到Main的默认访问修饰符为internal。

我还看到有人说,Main的默认访问修饰符是“隐式私有”的。

Visual Studio 2010会自动将程序的Main()方法定义为隐式私有。这样做可以确保其他应用程序不能直接调用另一个程序的入口点。

我知道internal和private之间存在差异。那么哪个是正确的呢?

6个回答

20
如果您的代码像这样:
static void Main()

那么这是一个私有方法。(静态的部分与可访问性无关,但必须是一个入口点。) 一般来说,任何成员的默认可访问性都是你可以声明的最私有可访问性。因此对于类或结构体中的方法,它是私有的。对于顶级(非嵌套)类型,它是internal。对于在类/结构中声明的任何成员,它都是private1。对于接口和枚举成员,它是public。

如果不看代码或者Class View的屏幕截图,很难理解你所看到的内容,但是无论是不是Main方法,默认的可访问性都是私有的。


1 显式接口实现在这里有点奇怪,因为它既不是私有的也不是公共的;它只能通过接口访问,而不能通过类型访问。


1
当然,在interfaceenum类型中声明的成员始终是公共的,并且不允许为enuminterface类型的成员指定任何访问修饰符。像你所说的那样,声明在classstruct中的成员默认情况下肯定是私有的。另一个问题:上面的Main方法是非静态的,因此它不能作为入口点。 - Jeppe Stig Nielsen

4
尽管您标记了问题 ,但是VS2010生成的默认 Program.Main 的访问修饰符实际上取决于项目模板,对于每种语言都不同。我快速尝试了以下内容:
  • 在VB.NET控制台项目中,Program 模块(静态类)是 Friend(即C#中的 internal),Main 静态方法是 Public

  • 在C#控制台项目中,PrograminternalMainprivate

也就是说,C#项目将仅使用默认访问修饰符(类的 internal,方法的 private)。

3

在类浏览器中,您看不到成员的默认访问修饰符,但可以看到实际的访问修饰符。

命名空间级别的类的默认访问修饰符是 internal,而类成员(包括嵌套类)的默认访问修饰符是 private。对于 Main() 函数没有特殊情况。如果它之前没有访问修饰符(比如 Jon Skeet 的例子),那么它是 private。如果有访问修饰符,那么它就是该修饰符指定的访问级别。


2

默认的类修饰符是 internal。main 方法是一个方法,且为 private。通常情况下,没有修饰符的类是 internal,没有声明的类成员(例如方法和字段)是 private。


1
非嵌套类的默认访问修饰符是 internal。对于嵌套类型,它是 private。 - Jon Skeet

2

私有成员仅在声明它们的类中可访问。

内部类型或成员仅在同一程序集中的文件中可访问。

内部“类似于”公共,但仅适用于同一程序集中的所有元素。程序集1的Class1无法“看到”或访问程序集2中的任何内部元素。


0

在 C# 中,Main() 的默认访问修饰符是 private。

这就是我在 ILDASM 中查看 MSIL(IL)代码时得到的结果。

你可以看到 Main() 是私有的。 C#中简单程序的IL代码


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