为什么允许入口点是私有的?这实际上是如何工作的?我认为Main应该被“召唤”。但如果它被标记为私有,那怎么可能呢?publicclassProgram{privatestaticvoidMain(){}}来自bytes.com上的JonSkeet:基本上,main方法的执行是由CLR中的特殊代码(或者可能是驱动CLR启动的代码)启动的,它不需要遵循相同的规则。资源此外,还有另一个问题已经涵盖了该主题。根据MSDN,Main方法不应公开:Main在类或结构中声明。Main必须是静态的,不应公开。(在前面的示例中,它接收私有的默认访问权限。)封闭类或结构不必是静态的。这是一个语言实现细节,CLR只是从程序集标头中读取EntryPointToken值,并不对该方法执行可访问性检查。底层调用是_AppDomain.ExecuteAssembly()。所以我们需要求助于C#LanguageSpecification,3.1节明确提到了可访问性规则:在C#中,每个方法都必须定义为类或结构的成员。通常,方法声明的可访问性(§3.5.1)由其声明中指定的访问修饰符(§10.3.5)确定,类似地,声明类型的可访问性由访问修饰符(§10.3.5)在其声明中指明。修饰符是可以的。为了使给定类型的给定方法可调用,类型和成员都必须是可访问的。但是,应用程序入口点是一种特殊情况。具体来说,执行环境可以访问应用程序的入口点,而不管其声明的可访问性如何,也不管其封闭类型声明的声明可访问性如何。粗体部分记录了CLR对EntryPointToken的作用。如果需要,C#编译器可以验证可访问性,但它不会。当您执行代码时,CLR会执行Main方法,而CLR编译器会搜索该Main方法。即使您提供主要小写字母,也不会调用它。.Net中的Acces修饰符是一个(非常强烈的)建议。您可以使用反射调用任何方法或访问任何属性/字段。考虑在调用main时行为有点像实际行为的代码。以上是C#学习教程:为什么允许入口点私有?如果分享的内容对你有用,需要了解更多C#学习教程,希望你多多关注——publicclassEntryPointAttribute:System.Attribute{publicstringEntryPoint{get;私有集;}publicEntryPointAttribute(stringentryPoint){this.EntryPoint=entryPoint;}}publicstaticclassEntryPointProcessor{publicstaticvoidProcess(objecttheObject){Typet=theObject.GetType();varep=t.GetCustomAttributes(typeof(EntryPointAttribute),true).FirstOrDefault();字符串entryPointName=((EntryPointAttribute)ep).EntryPoint;MethodInfomi=t.GetMethod(entryPointName,BindingFlags.Static|BindingFlags.NonPublic);mi.Invoke(null,newobject[0]{});}}[EntryPoint("anentrypoint")]publicclassentryPointClass{privatestaticvoidanentrypoint(){Console.WriteLine("inanentrypoint");}}classProgram{staticvoidMain(string[]args){EntryPointProcessor.Process(newentryPointClass());}}本文来自网络整理自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如有转载请注明出处:
