Programクラスは静的である必要がありますか?


9

新しいASP.NET Core 3プロジェクトを作成した後、Visual Studio 2019で次の警告が表示されます。

警告CA1052タイプ「プログラム」は静的ホルダータイプですが、静的でもNotInheritableでもありません

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

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

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

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

static修飾子を追加する必要がありますか?なぜ/なぜですか?長所と短所?

編集:これはASP.NET Core 3 APIです


あなたはそのトピックに関して良いマニュアルが言わなければならないことを読みましたか?
Caius Jard

私はそうしましたが、ご存じのように、プログラムは特別なケースです
ネルソン・スーザ'22

1
プログラムはどのように特別なケースですか?プログラムと呼ぶ必要すらありません。静的なvoid Mainを持つクラスは、開始アプリのエントリポイントになることができます
Caius Jard

では、なぜマイクロソフトはプログラムを静的クラスにしないのですか?彼らはすべき?
ネルソンスーザ、

2
静的なvoid Mainを持つクラスは、開始アプリのエントリポイントになることができます
Caius Jard

回答:


11

より基本的には、メッセージは次のように想像することができます。

クラス 'Program'には、静的として宣言されたメソッドのみが含まれているため、継承階層に参加できません。静的として宣言する(または静的クラスをサポートしない古いバージョンの.netを対象にしている場合は封印する)ことで、その設計感情がより正確に反映されるようにする

クラスには静的なものしか含まれていないため、クラスを静的としてマークすることをお勧めします。これにより、継承しようとするミスを犯し、継承されたバージョンで継承に役立つ何かを実行できると考える人を防ぐことができます

プログラム自体には特別なことは何もないので、マイクロソフトはそれを静的とマークしません。その中に非静的メソッドを置くことも、static void Mainインスタンス化可能なPersonなどの別のクラスに置くこともできます。

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

これは正常に動作します。クラスは、アプリケーションのエントリポイントをホストするために静的である必要はありません。この場合、非静的メンバーがあるため、クラスを静的にすることはできません。これは、メインでインスタンス化することができます(メインでインスタンス化できます)。プログラムとは呼ばれません。Programというクラスはどこにもなく、この小さなアプリはまだ実行されます(あまり機能しません)。

あなたのケースでは、推奨されるようにして、クラスに静的修飾子を追加してください。これにより、プログラムがより堅牢に設計されます。または、プログラムをインスタンス化する正当な理由が考えられる場合はインスタンスメンバーを追加するか、メッセージを無視してください静的メソッドのみを含む非静的クラスを続行します-それでも機能します

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.