3

我开始用 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;
        }
    }


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

4

3 回答 3

4

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

还要尽量避免在构造函数中做“工作”。构造函数是用来构造实例的,仅此而已。

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

于 2015-04-29T13:59:22.423 回答
2

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

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

于 2015-04-29T13:55:56.470 回答
0

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

于 2015-04-29T14:21:48.170 回答