より良いエンジニアを目指して

1日1つ。良くなる!上手くなる!

C#はMain関数から始まる

C#でコンソールプロジェクトを作成した時に生成されるのは

    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("Hello World!");
        }
    }

です。

f:id:rimever:20190312224837p:plain
.NET Coreでも同じです

Program.csもMain関数もプロジェクトファイルにも記載されていません。

ですがMain関数をエントリポイントとしてプログラムが開始されます。

C#は何を判断基準としてプログラムを実行開始しているのでしょうか。

おまじないだなんだと言われ、触れてはならない聖域のように考えていました。

今回、いたずらをしてファイル名などを変えてみて試してみます。

Program.csをNotProgram.csに変更してみる

問題なく動作します。

f:id:rimever:20190312225105p:plain

Programクラスをstaticクラスにしてみる

問題なく動作します。

f:id:rimever:20190312230850p:plain

staticなMain関数から呼べるのはstaticなメソッドだけです。

Programクラスは潔くstaticクラスにしていい気もします。

Main関数の名前をNotMainに変更してみる

コンパイルエラーになります。

プログラムは、エントリポイントに適切な静的'Main'メソッドを含んでいません。

f:id:rimever:20190312225324p:plain

ダメ元で、Main関数を複数のクラスに持たせてみる

    class Program1
    {
        static void Main(string[] args)
        {
            Console.WriteLine("Hello World");
            Console.ReadKey();
        }
    }
    class Program2
    {
        static void Main(string[] args)
        {
            Console.WriteLine("Hello World");
            Console.ReadKey();
        }
    }

やっぱり、コンパイルエラーです。手堅いC#がそんなことを許すわけありませんね。

プログラムで複数のエントリ ポイントが定義されています。エントリ ポイントを含む型を指定するには、/main でコンパイルしてください。

f:id:rimever:20190312230105p:plain

さいごに

C#歴もだいぶ長くなってきて、当たり前を疑ってみました。

XamarinのiOSのプロジェクトを作成すると下記のようになります。

f:id:rimever:20190312224425p:plain

  • Main.cs
  • class Application
  • static void Main(string[] args)

Main.csなのにclassがApplicationというのは嫌だから、変えたいなあと思ったのです。

また、いつものProgram.csもプログラミングだからProgramは間違っていないのですが、個人的にはニュアンスとしてはApplication.csとかの方がいいんじゃないかなあとか思った次第です。