程序类应该是静态的吗?

25

在创建一个新的ASP.NET Core 3项目后,我在Visual Studio 2019中遇到了以下警告:

警告 CA1052 类型“Program”是一个静态持有者类型,但既不是静态的也不是NotInheritable

public class Program
    {
        public static void Main(string[] args)
        {
            // ...
        }

        public static IHostBuilder CreateHostBuilder(string[] args) =>
            // ...
    }

VS

public static class Program
    {
        public static void Main(string[] args)
        {
            // ...
        }

        public static IHostBuilder CreateHostBuilder(string[] args) =>
            // ...
    }

我是否应该添加 static 修饰符?为什么/为什么不?优缺点是什么?

编辑:这是一个 ASP.NET Core 3 API


1
我做了,但是程序,正如你所知道的,是一个特殊情况。 - Nelson Sousa
1
程序是一个特殊情况吗?它甚至不需要被称为“程序”。任何具有静态void Main的类都可以成为启动应用程序的入口点。 - Caius Jard
4
那么,为什么微软没有将Program类设置为静态类?他们应该这样做吗? - Nelson Sousa
2
任何具有静态 void Main 方法的类都可以成为启动应用程序的入口点。 - Caius Jard
1
@CaiusJard 我不是在谈论 Main 方法,我是在谈论 Program 类。 - Nelson Sousa
显示剩余3条评论
1个回答

33

简单来说,建议将类标记为 static,因为它只包含静态内容。这将防止任何人错误地继承该类,并认为他们可以在继承版本中进行有用的继承操作。

Microsoft 不会为您标记它为 static,因为 Program 类并没有什么特别之处;您可以在其中放置非静态方法,或者您可以将 static void Main 放在另一个可实例化的类(如 Person)中。

class Person{
  public string Name {get;set;}
  static void Main(){
    Person p = new Person();
    p.Name = Console.ReadLine();
  }
}
这样做是可行的;一个类不必是静态的来托管应用程序的入口点,在这种情况下,这个类不能是静态的,因为它有非静态成员。它可以被实例化(在main方法中),并且它不叫Program; 任何地方都没有叫Program的类,而且这个小应用程序仍然能运行(没有做多少事情..)
对于你的情况,要么按建议将static修饰符添加到类中,因为它会使你的程序更加稳固,要么添加一个实例成员,如果你可以想到一个合理的理由来实例化Program,或者忽略消息,继续使用只包含静态方法的非静态类 - 它仍然能工作。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接