一个只运行一次的类是否应该包含一个静态构造函数?

时间:2015-04-29 13:42:07

标签: c# oop constructor static-constructor

我开始用C#学习OOP编程。 关于设计,对我来说使用static构造函数对我的程序的主类是有意义的,考虑到这个类包含只运行一次的代码(我的整个程序非常简单,由一个.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;
        }
    }


问题:我的假设是正确的,使用第二个代码而不是第一个代码?或者我错过了什么? 换句话说:哪一个更好(被认为是更好的设计)?在这种情况下,静态构造函数中是否有一些基本的东西会给我带来麻烦?

3 个答案:

答案 0 :(得分:4)

尽量避免使用静态构造函数。与实例构造函数不同,您不能主动调用静态构造函数 - 它在首次使用类型时运行(由于最优化甚至混淆可能会更改)。

还要尽量避免做"工作"在构造函数中。构造函数用于构造实例,仅此而已。

因此,在这两种情况下,我都会将功能移到方法中。然后,该方法可以具有实际返回值,而不是设置属性。由于您未维护任何状态(Program.status然后变为返回值),您可以安全地使该方法成为静态。

答案 1 :(得分:2)

提供的代码完全相同,除非在第一个实例中创建对象Program而不是使用静态成员。这将为您的应用程序创建额外的开销。现在在这种情况下,确实没有理由选择任何一种方法,因为开销可以忽略不计。

然而,在第一个实例中,值status是基于实例的。因此,只有Program的实例具有status的值。因此,如果status是基于实例的字段,其中Program的多个实例应保留其自己的status字段值,那么您应该使用第一个示例。

答案 2 :(得分:0)

OP可能正在寻找Singleton模式。 我个人的观点是,如果一个类只会被实例化一次,那么它首先成为一个类是没有理由的,并且如果这个类的所有方法都被恢复为静态C,则会减少调用开销。功能 - 但这只是我的意见。