C# 只运行一次的类是否应该包含静态构造函数?
我开始学习用C#进行面向对象编程。 关于设计,考虑到这个类包含只运行一次的代码(我的整个程序非常简单,只包含一个.cs文件),我认为对我的程序的主类使用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[
静态
构造函数是有意义的
例如,下面是使用普通构造函数的示例代码:
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程序。