【问题标题】:Default access specifier of Main()Main() 的默认访问说明符
【发布时间】:2013-12-25 16:12:48
【问题描述】:

C#中Main方法的默认访问说明符是什么?

如果 static void Main() 的默认访问说明符是私有的,那么外部实体例如如何。操作系统调用此方法?

任何外部进程都应该不能调用这个方法。

【问题讨论】:

  • 操作系统不知道/不关心Main。 CLR 没有理由不能访问私有方法。毕竟,你也可以,使用反射。
  • 没有外部实体调用它。运行时/加载器框架调用它。
  • 顺便说一句。你甚至不需要反射: ((dyanmic)obj).PrivateMethod();
  • @thefiloe 不,这行不通。您不能将动态与私有方法一起使用。你会得到一个 RuntimeBinderException ("... is inaccessible due to its protection level")。
  • 你确定吗?这对我来说是一个全新的事实。

标签: c# main access-specifier


【解决方案1】:

C#中Main方法的默认访问说明符是什么?

所有方法的默认访问说明符是private

那么操作系统等外部实体是如何调用这个方法的呢?

它没有。主要方法由 CLR 调用。由于 CLR 是强制隐私语义的东西,它可以忽略它。

但这实际上并不是正确的答案。正确的答案是说您的问题表明您对“私人”适用的内容有一个共同但不正确的想法。 “私有”并不意味着“不能从外部实体调用此方法”

相反,访问修饰符适用于事物的名称。也就是说,访问修饰符确定事物名称的可访问域:它确定名称可能表示所讨论事物的代码区域。 private 修饰符的意思是“这个实体的可访问域是声明它的类型的整个主体”。任何在该可访问域之外查找该名称的尝试都不会导致名称解析选择实体。名称解析将选择其他内容,或者名称解析将失败。

绝对可以通过其他机制调用私有方法。您可以委托它并传递它。如果您有足够的信任,您可以使用私有反射。等等。 main方法的调用就是这样一种机制;它首先不会按名称查找Main

【讨论】:

    【解决方案2】:

    首先,操作系统对你的Main一无所知。

    CLR(调用Main)可以调用它,无论您为它指定什么访问级别(internalprivateprotectedpublic)。您甚至可以使用反射自己查看和调用/使用外部库中的所有方法/类型/接口(是的,internalprivate 也是如此)。

    【讨论】:

      【解决方案3】:

      它的默认访问说明符是私有的,尽管它也可以是公共的或内部的。 来自 msdn: http://msdn.microsoft.com/zh-cn/library/acy3edy3 此外,我们想知道为什么私有方法被外部调用。我认为,在 C# 中定义的访问级别(公共、内部、保护、私有)只是受编译器的限制,这是 IDE 和开发人员的严格规则,但对于 CLR 和 OS,他们不必遵守这个规则,他们可以从反射地址调用任何函数或方法,就像我们可以通过反射调用方法一样,所以私有Main方法可以是入口。

      【讨论】:

        猜你喜欢
        • 2011-06-15
        • 2016-01-15
        • 2012-04-09
        • 2011-04-13
        • 1970-01-01
        • 1970-01-01
        • 2011-01-31
        • 2016-08-11
        • 1970-01-01
        相关资源
        最近更新 更多