我有一个长度很长的程序,有一个类和很多方法。除了using语句之外,所有这些都必须包含在一个包含整个文件的巨大类中。这个巨大的包装类的必要性似乎毫无意义,这是在以后制作具有多个文件的程序时使用的吗?
using System;
using System.IO;
using System.Text.RegularExpressions;
using System.Collections.Generic;
using System.Linq;
public class CollectKeywordsFromLogs // why do I need this ( when it is the only class [as i just added the test class for the question])
{
//a class
//constructor
//methods
//methods
public static void Main() // and why would i need to explicitly declare this public? it works either way, and a private main would be useless no?
{}
}
这是我的完整档案。我编译csc file.cs然后编译file.exe。
噢,区分大小写。谢谢。但仍然 - >为什么我不需要使用测试类时的包装类?
答案 0 :(得分:6)
C#中没有全局方法或变量。它们必须位于类声明(如类或结构)中。这也适用于Main()方法。
Eric Lippert在问题Why C# is not allowing non-member functions like C++上发布了一个很好的答案,并在his blog进一步跟进:Why Doesn't C# Implement "Top Level" Methods?
您还可以找到以下MSDN链接:Comparison Between C++ and C#
Main()方法是C#程序的入口点。程序中应该只有一个入口点,但是,程序中可以有多个包含Main()方法的类。但是,如果您有多个Main方法,则应通过使用compiler option /main
编译程序来指定要用作入口点的Main方法。
根据MSDN,Main()方法必须为static
,不应为public
。默认情况下,VS2008将Main()创建为静态私有,运行时可以毫无问题地调用它。您可以将其更改为public
,它将正常编译。但是,我认为这是非常尴尬的,因为你不能阻止其他类调用Main(),因为它是公共的。
有关Main方法的详细信息,请参阅以下MSDN文章:Main() and Command-Line Arguments (C# Programming Guide)
答案 1 :(得分:1)
主要必须具有正确的签名才能被识别为程序启动方法。这意味着每个班级只能有1个。每个程序可以有1个以上,你可以选择应该在编译器命令行或Project | Properties | Application中提供main的类(查找组合框'启动对象')。
那个大班听起来很奇怪,你能说出你的意思吗?一个猜测,你不是在混淆class
和namespace
吗?
在回复您的编辑时,在C#每个方法(包括Main)中,必须在一个类中。见this post。根据定义,main的签名是
public static void Main(string[] args) { }
虽然您可以省略args参数。您的案例中的命令行将是:
csc /main:CollectKeywordsFromLogs file.c
当您退出/ main
时,有默认的规则规则答案 2 :(得分:1)
在C#中它应该是Main< --- capital M:D
答案 3 :(得分:1)
在我看来,当你应该使用namespace时,你正在使用课程。
除此之外......在C#中,所有代码都必须在某种类中。为Main()
方法制作例外是愚蠢的。
顺便说一下,私有Main()
实际上可以作为程序入口点工作。
答案 4 :(得分:0)
C#使用基于类的面向对象编程范式,全局变量属于其他范例,如过程式编程;查看有关编程范例的文章here。确实,一些面向对象的编程语言,特别是C ++,支持全局变量,但不支持C#(这是一个很好的东西:o))。