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

C# 只运行一次的类是否应该包含静态构造函数?,c#,oop,constructor,static-constructor,C#,Oop,Constructor,Static Constructor,我开始学习用C#进行面向对象编程。 关于设计,考虑到这个类包含只运行一次的代码(我的整个程序非常简单,只包含一个.cs文件),我认为对我的程序的主类使用静态构造函数是有意义的 例如,下面是使用普通构造函数的示例代码: class Program { const string file = @"C:\Program Files (x86)\myapp\log.txt"; int status; static int Main(string[

我开始学习用C#进行面向对象编程。 关于设计,考虑到这个类包含只运行一次的代码(我的整个程序非常简单,只包含一个.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;
        }
    }
这里遵循相同的结构,但是使用了
静态
构造函数,因为我认为这已经足够了。请注意,
状态
访问权限也已更改

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;
        }
    }

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

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


但是,在第一个实例中,值
status
是基于实例的。因此,只有
程序的实例
具有status的值。因此,如果
状态
是一个基于实例的字段,其中
程序
的多个实例应保持其自己的
状态
字段值,则应使用第一个示例。

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

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


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

OP可能正在寻找单例模式。
我个人的观点是,如果一个类只会被实例化一次,那么它根本没有理由成为一个类,如果将此类类的所有方法都还原为静态C函数,则调用开销会减少,但这只是我的观点。

调用代码是什么样子的?@Legends我想这是程序的入口;)可能没有直接关系,但不是有一个带有程序入口点
Main
的单一类和代码,而是有两个单独的类,一个带有入口点(程序),另一个与您的业务逻辑。稍后,您可以决定将该类设置为静态或非静态。您认为这比在
Main
中而不是构造函数中设置相同的代码有什么好处?第一种方法不好,因为程序类和主函数的交互方式不同寻常。第二种方法更糟糕,因为它不必要地依赖于CLR在执行过程中的某个点自动进行的函数调用,而不是在代码中进行实际可见的调用,这更清晰,在本程序中完全没有必要。谢谢,非常清楚的解释。您是否建议我将代码放在
Main
方法中,就像有人在评论中建议的那样?只要它不会变得太大,当然。但不管怎样,我担心你仍然会创建一个过程程序而不是OOP程序。