C#の開発環境について

投稿者: user31658

最近VS Codeを使ってC#のプログラミングの勉強を始めました。

そこで質問なのですが、簡単なプログラムをいくつも作って単体で動かす練習をしたい場合に、現在の環境ではメインメソッドを備えたクラスを複数作ることが許されません。

私としては、Javaのように1つのパッケージにメインメソッドを含んだクラスがたくさん連続して作成できたらいいのになと思うのですが、C#ではそれは叶わないのでしょうか。

例えばハローワールドのプログラムを1つ作っちゃったら、次にFizzBuzzを書いて動かすにはハローワールドを削除して…ってめんどくさすぎやしませんか。

基本的な文法などを学びたいだけなのに大変過ぎます。

あるいは、Visual Studioなら可能ですか。軽さが好きなのでできればVS Codeでいきたいのですが。

皆さんどうされてますか。よろしくお願いいたします。

解決

実行時引数にクラス名を指定して起動する

実行時引数にクラス名を指定して起動する、ということを実現するコードを書いてみました。
対象のクラスにClassMainという名前のメソッドを実装しておけばクラス名から呼び出せる仕組みです。

using System;
using System.Linq;

namespace SampleApp
{
    class Program
    {
        static void Main(string[] args)
        {
            CallClassMain(args);
        }

        static void CallClassMain(string[] args)
        {
            try
            {
                if (args.Length < 1) throw new ArgumentException("Requires startup class name");
                var className = nameof(SampleApp) + "." + args[0];
                var arguments = args.Skip(1).ToArray();
                var type = Type.GetType(className);
                if (type is null) throw new ArgumentException($"No such class: {className}");
                type.InvokeMember("ClassMain", System.Reflection.BindingFlags.InvokeMethod, null, null, new object[] { arguments });
            }
            catch (Exception ex)
            {
                Console.WriteLine($"Error: {ex.Message}");
            }
        }
    }

    public class Sample1
    {
        public static void ClassMain(string[] args)
        {
            Console.WriteLine("Hello, Sample1");
        }
    }

    public class Sample2
    {
        public static void ClassMain(string[] args)
        {
            Console.WriteLine("Hello, Sample2");
        }
    }
}

使い方はこんな感じです。

> SampleApp.exe Sample1
Hello, Sample1

コメントアウトで切り替える

自分としては以下のようなコメントアウトで自分で切り替えるのがシンプルで一番わかりやすいです。

static void Main(string[] args)
{
    Sample1.ClassMain(args);
    //Sample2.ClassMain(args);
}
回答者: Anonymous

Leave a Reply

Your email address will not be published. Required fields are marked *