¿La clase del programa debe ser estática?

9

Recibo la siguiente Advertencia en Visual Studio 2019, después de crear un nuevo proyecto ASP.NET Core 3:

Advertencia CA1052 Tipo 'Programa' es un tipo de soporte estático pero no es estático ni no heredable

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) =>
            // ...
    }

¿Debo agregar el modificador estático? ¿Por qué por qué no? Pros y contras'?

Editar: Esta es una API ASP.NET Core 3

Nelson Sousa
fuente
¿Leíste lo que dice el excelente manual sobre el tema?
Caius Jard
Lo hice, pero el Programa, como saben, es un caso especial
Nelson Sousa el
1
¿Cómo es el programa un caso especial? Ni siquiera necesita llamarse Programa. Cualquier clase con un vacío estático Principal puede ser un punto de entrada para una aplicación de inicio
Caius Jard
Entonces, ¿por qué Microsoft no convirtió el Programa en una clase estática? ¿Ellos deberían?
Nelson Sousa el
2
Cualquier clase con un vacío estático Main puede ser un punto de entrada para una aplicación de inicio
Caius Jard

Respuestas:

11

En términos más básicos, se puede imaginar que el mensaje dice:

Su clase 'Programa' solo parece contener métodos que se declaran como estáticos y, como resultado, no puede participar en una jerarquía de herencia. Declararlo como estático (o sellado si está apuntando a una versión antigua de .net que no admite clases estáticas) para reflejar con mayor precisión cuál es su sentimiento de diseño

Es una recomendación marcar su clase como estática porque solo contiene material estático. Esto evitará que cualquiera cometa el error de intentar heredar de él y piense que puede hacer algo útil en cuanto a herencia con la versión heredada

Microsoft no lo marca como estático para usted porque no hay nada especial en el Programa per se; podría poner métodos no estáticos en él, o podría poner su static void Mainen otra clase, como Persona, que ES instanciable.

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

Esto funcionaría bien; una clase no tiene que ser estática para alojar el punto de entrada de la aplicación y, en este caso, la clase no podría ser estática porque tiene miembros no estáticos. Puede ser (y es, en lo principal) instanciado en lo principal. No se llama programa; no hay una clase llamada Programa en ningún lado y esta pequeña aplicación aún se ejecutará (no hace mucho ...)

En su caso, haga lo recomendado y agregue un modificador estático a su clase, ya que hará que su programa tenga un diseño más robusto o agregue un miembro de instancia si puede pensar en una razón válida para crear instancias del Programa o ignore el mensaje y continúe con su clase no estática que contiene solo métodos estáticos: seguirá funcionando

Caius Jard
fuente