3

C# で OOP プログラミングを学び始めています。設計に関しては、プログラムのメイン クラスにコンストラクターを使用することは理にかなっています。staticこのクラスには 1 回だけ実行されるコードが含まれていることを考えると (私のプログラム全体は非常に単純で、単一の .cs ファイルで構成されています)。

たとえば、通常のコンストラクタを使用したサンプル コードは次のとおりです。

class Program
    {
        const string file = @"C:\Program Files (x86)\myapp\log.txt";
        int status;

        static int Main(string[] args)
        {
            var myObj = new Program();
            return myObj.status;            
        }

        public Program()
        {
            int retCode;

            try {
                //  lots of procedures using the file

                retCode = 0;   // ok
            }
            catch (Exception ex) {
                Console.WriteLine(ex.Message);

                retCode = 999; // specific error
            }

            status = retCode;
        }
    }

これは同じ構造に従いますが、staticコンストラクターを使用しています。これで十分だと思います。statusアクセスも変更されていることに注意してください。

class Program
    {
        const string file = @"C:\Program Files (x86)\myapp\log.txt";
        static int status;

        static int Main(string[] args)
        {
            return Program.status;
        }

        static Program()
        {
            int retCode;

            try {
                //  lots of procedures using the file

                retCode = 0;
            }
            catch (Exception ex) {
                Console.WriteLine(ex.Message);

                retCode = 999;
            }

            status = retCode;
        }
    }


質問:最初のコードの代わりに 2 番目のコードを使用するという私の仮定は正しいですか? または、何か不足していますか?言い換えれば、どちらが好ましいですか(より良いデザインと見なされます)?そして、この場合に問題を引き起こす静的コンストラクターに基本的なものはありますか?

4

3 に答える 3

4

静的コンストラクターの使用はできるだけ避けてください。インスタンス コンストラクターとは異なり、静的コンストラクターをアクティブに呼び出すことはできません。型が最初に使用されるときに実行されます (最適化や難読化によって変更される可能性があります)。

また、コンストラクターで「作業」を行うことは避けてください。コンストラクターはインスタンスを構築するためのものであり、それ以上のものではありません。

したがって、どちらの場合も、機能をメソッドに移動します。そのメソッドは、プロパティを設定するのではなく、実際の戻り値を持つことができます。状態を維持していないため(Program.statusその後、戻り値に変換されます)、そのメソッドを安全に静的にすることができます。

于 2015-04-29T13:59:22.423 に答える