【发布时间】:2011-04-13 18:08:25
【问题描述】:
我在 vs2010 中创建了一个示例类。
通过类视图,我看到 Main 的默认访问修饰符是 internal。
我还看到有人说 Main 的默认访问修饰符是“隐式私有”。
Visual Studio 2010 自动将程序的 Main() 方法定义为隐式私有。这样做可以确保其他应用程序无法 直接调用另一个的入口点。
我知道内部和私人之间存在差异。那么哪个是正确的呢?
【问题讨论】:
标签: c#
我在 vs2010 中创建了一个示例类。
通过类视图,我看到 Main 的默认访问修饰符是 internal。
我还看到有人说 Main 的默认访问修饰符是“隐式私有”。
Visual Studio 2010 自动将程序的 Main() 方法定义为隐式私有。这样做可以确保其他应用程序无法 直接调用另一个的入口点。
我知道内部和私人之间存在差异。那么哪个是正确的呢?
【问题讨论】:
标签: c#
如果您的代码如下所示:
static void Main()
那么这是一个私有方法。 (static 部分与可访问性正交,但必须作为入口点。)通常,任何成员的默认可访问性是您可以声明的最私密的可访问性。因此,对于类或结构中的方法,这是私有的。对于顶级(非嵌套)类型,它是内部的。对于在类/结构中声明的任何成员,它都是私有的1。对于接口和枚举成员,它是公开的。
如果不查看代码或类视图的屏幕截图,很难准确理解通过类视图看到的内容,但方法的默认可访问性绝对是私有的。不管是不是Main方法都是这样。
1 显式接口实现在这里有点奇怪,因为它既不是私有的也不是公共的;它根本无法通过类型访问,只能通过接口访问。
【讨论】:
interface 或enum 类型中声明的成员始终是公共的,并且不允许使用enum 和interface 类型的成员指定任何访问修饰符。 class 或 struct 中声明的成员默认情况下肯定是私有的,就像你说的那样。另一个问题:上面的Main 方法是非静态的,所以不能作为入口点。
虽然您标记了您的问题c#,但让我说VS2010 生成的默认Program.Main 的访问修饰符实际上取决于项目模板,每种语言的这些不同。我很快尝试了以下方法:
在 VB.NET 控制台项目中,Program 模块(静态类)是 Friend(即 C# 中的 internal),Main 静态方法是 Public。
在 C# 控制台项目中,Program 是 internal,Main 是 private。
也就是说,C# 项目将简单地使用默认访问修饰符(internal 用于类,private 用于方法)。
【讨论】:
在类浏览器中看不到成员的默认访问修饰符,可以看到实际访问修饰符。
命名空间级别的类的默认访问修饰符是internal,而类成员(包括嵌套类)的默认访问修饰符是private。 Main() 函数没有特殊情况。如果前面没有访问修饰符(以 Jon Skeet 为例),则为 private。如果有,那就是它。
【讨论】:
两者,默认的类修饰符是内部的。 main 方法是一个方法并且是私有的。一般来说,没有修饰符的类是内部的,没有声明的类成员(例如方法和字段)是私有的。
【讨论】:
私有成员只能在声明它们的类的主体内访问。
内部类型或成员只能在同一程序集中的文件中访问
内部“就像”公共的,但仅适用于同一程序集的所有元素。 assembly1 的 Class1 不能“看到”或访问 assembly2 的任何内部元素。
【讨论】:
默认情况下,C# 中 Main() 的访问说明符是私有的。
这是我在 ILDASM 中看到 MSIL(IL) 代码时得到的。
您可以看到 Main() 是私有的。
【讨论】: