C# 多个主要功能
我在这方面有点生疏,所以请容忍我。我目前正在学习C#和Java,它们的一个相似之处是主函数需要封装在一个类中。比如说C# 多个主要功能,c#,java,main,C#,Java,Main,我在这方面有点生疏,所以请容忍我。我目前正在学习C#和Java,它们的一个相似之处是主函数需要封装在一个类中。比如说 public class HelloWorld { public static void main(String[] args) { // Some Code } } 现在我了解到,在运行程序时,main通常是“入口点”。因此,基本上,程序将开始执行主函数所在的任何位置。但我相信在这两种语言中,您可以在多个类中拥有多个主函数。因此,当我编译一个包
public class HelloWorld {
public static void main(String[] args) {
// Some Code
}
}
现在我了解到,在运行程序时,main通常是“入口点”。因此,基本上,程序将开始执行主函数所在的任何位置。但我相信在这两种语言中,您可以在多个类中拥有多个主函数。因此,当我编译一个包含多个主函数的项目时,“入口点”在哪里?编译器如何知道从哪里开始?在Java中,计算机在实际执行程序时确定“入口点”,而不是在编译时。例如,从命令行
java MyClass
在MyClass
中搜索main()
。忽略所有其他main()
函数
如果使用的是IDE,则可以设置要使用的
main()
函数所包含的类。在.NET中,可以定义编译时要使用的main方法所包含的类
在Java中,如果要绑定到jar,可以在jar的清单中定义入口点
在C#中,可以使用多个Main
方法
如果有多个Main
方法,编译器不知道使用哪个入口点,因此它将向您显示一个错误
您需要在编译时使用:
您可以在Visual Studio开发环境中或通过csc编译器指定要用作编译器选项的方法。在C#中,您可以使用/main:
编译器选项指定入口点
考虑以下代码,其中包含两个main()
函数:
namespace Application {
class ClassOne {
static void main () {
// Code here
}
}
class ClassTwo {
static void main () {
// Code here
}
}
}
要使用ClassOne.main()
作为入口点,您需要在编译时指定以下内容:
csc /main:Application.ClassOne hello.cs
主类是一个特殊的类,原因只有一个:当运行Java虚拟机时,JVM调用该函数。它本质上类似于任何其他函数,事实上,您可以从另一个类调用一个类的主函数 当您使用多个类编译项目时,您会告诉JVM使用您想要使用的主类运行该类,如下所示:
java SomeClass
它将运行SomeClass的主方法,假设SomeClass已编译并且相应的编译文件位于类路径中。(这是您必须在特定操作系统中解决的问题,但我认为-cp选项指定类路径是相当常见的)。因此:
java -cp /home/MyName Someclass
将在Java中运行目录/home/MyName中的某个类的主函数,正如其他人指出的那样,在运行
Java
命令时定义包含主函数的类
但是您也可以构建一个可执行的jar,它可以与
java-jar my.jar
一起运行。在这种情况下,您需要一个名为manifest.MF
的清单文件,该文件位于jar的META-INF
文件夹中。在此文件中,您可以使用以下语句指定包含主函数的类:main class:YourClass
对于多个主函数,入口点可以通过以下方式声明:
在Visual Studio开发环境中设置此编译器选项
打开项目的属性页
单击应用程序属性页
修改启动对象属性
引用:主方法是静态的,这意味着它属于类而不是对象。因此,对象中根本没有其他主方法。它不会有额外的main方法,因为main是静态的。所以每节课一次
如果您的项目中有多个主要方法,您将指定在启动应用程序时启动哪个方法实际上,在二进制文件中,例如windows中的PE格式和Linux或任何其他系统中的ELF格式,二进制文件的头将指定起始地址的位置,并且只能有一个 哪一个应该是入口点?这取决于链接器。正如@SetFreeByTruth所说,您可以使用命令行参数指定它。 许多链接器支持使用命令行参数指定入口点。例如,gnu的gld可以使用参数-e指定入口点
我不知道Java的行为,因为它是由Java虚拟机加载的。在Visual Studio中,选择要作为入口点的项目,右键单击并设置为启动项目 每种语言的答案都不同。在Java中,它搜索
公共静态void main(String[]args)
@LuiggiMendoza Yes,这是正确的。为了简洁起见,我省略了main()的完整签名,因为OP已经证明他知道它是什么。或者对于方法签名publicstaticvoidmain(String[])
或publicstaticvoidmain(String…
,非常精确。其他主要方法并没有被“忽略”,它们只是不会自动执行。程序员可以编写显式调用类的主方法的代码!我的第一枚银牌!感谢所有投票支持这个答案的人!我不知道C#,但在Java中,这是不正确的。Java编译器不关心将使用哪个入口点;它将编译所有这些文件。另一方面,必须告诉运行时环境要执行哪个入口点。是的……但这个ans是指c#而不是java@Code-Guru:对于C#,答案是正确的,因为程序集在编译时有一个指定的入口点-在执行时不指定类名,只有程序集名称。@Jonsket原始答案没有指定语言。谢谢你的编辑,阿尼鲁达。我很惊讶这是投票最多的答案。至少对于Java来说,来自代码大师和@CosmicComputer的答案似乎与大多数人更相关。我想说,除了少数几个提供“可执行”jar的开发人员之外,很少有开发人员使用过manifest方法。@geogehawkins