A classe Program deve ser estática?

9

Estou recebendo o seguinte aviso no Visual Studio 2019, depois de criar um novo projeto do ASP.NET Core 3:

Aviso CA1052 O tipo 'Programa' é um tipo de suporte estático, mas não é estático nem 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) =>
            // ...
    }

Devo adicionar o modificador estático? Porque porque não? Prós e contras'?

Editar: Esta é uma API do ASP.NET Core 3

Nelson Sousa
fonte
Você leu o que o bom manual tem a dizer sobre o assunto?
Caio Jard
Eu fiz, mas Programa, como você sabe, é um caso especial
Nelson Sousa
1
Como o Programa é um caso especial? Nem precisa ser chamado de Programa. Qualquer classe com um static void Main pode ser um ponto de entrada para um aplicativo começando
Caio Jard
Então, por que a Microsoft não fez do Program uma classe estática? Eles deviam?
Nelson Sousa
2
Qualquer classe com um static void Main pode ser um ponto de entrada para um aplicativo começando
Caio Jard

Respostas:

11

Em termos mais básicos, pode-se imaginar que a mensagem diga:

Sua classe 'Programa' parece conter apenas métodos declarados como estáticos e, como resultado, não pode participar de uma hierarquia de herança. Declare-o como estático (ou selado se você estiver direcionando uma versão antiga do .net que não oferece suporte a classes estáticas) para refletir com mais precisão qual é o seu sentimento de design.

É uma recomendação marcar sua classe como estática porque ela contém apenas coisas estáticas. Isso impedirá que alguém cometa o erro de tentar herdar dela e pensar que pode fazer algo útil em termos de herança com a versão herdada

A Microsoft não a marca como estática para você, porque não há nada de especial no Programa; você pode colocar métodos não estáticos nele ou o seu static void Mainem outra classe, como Person, que é instável.

class Person{
  public string Name {get;set;}
  static void Main(){
    Person p = new Person();
    p.Name = Console.ReadLine();
  }
}

Isso funcionaria bem; uma classe não precisa ser estática para hospedar o ponto de entrada do aplicativo e, nesse caso, a classe não pode ser estática porque possui membros não estáticos. Pode ser (e é, no geral) instanciado no principal. Não se chama Programa; não existe uma classe chamada Program em nenhum lugar e esse pequeno aplicativo ainda será executado (não faz muito ..)

No seu caso, faça o recomendado e adicione um modificador estático à sua classe, pois isso tornará seu programa um pouco mais robusto ou adicione um membro da instância se você puder pensar em um motivo válido para instanciar o Programa ou ignore a mensagem e continue com sua classe não estática que contém apenas métodos estáticos - ainda funcionará

Caius Jard
fonte