我开始用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;
}
}
问题:我的假设是正确的,使用第二个代码而不是第一个代码?或者我错过了什么?
换句话说:哪一个更好(被认为是更好的设计)?在这种情况下,静态构造函数中是否有一些基本的东西会给我带来麻烦?
答案 0 :(得分:4)
尽量避免使用静态构造函数。与实例构造函数不同,您不能主动调用静态构造函数 - 它在首次使用类型时运行(由于最优化甚至混淆可能会更改)。
还要尽量避免做"工作"在构造函数中。构造函数用于构造实例,仅此而已。
因此,在这两种情况下,我都会将功能移到方法中。然后,该方法可以具有实际返回值,而不是设置属性。由于您未维护任何状态(Program.status
然后变为返回值),您可以安全地使该方法成为静态。
答案 1 :(得分:2)
提供的代码完全相同,除非在第一个实例中创建对象Program
而不是使用静态成员。这将为您的应用程序创建额外的开销。现在在这种情况下,确实没有理由选择任何一种方法,因为开销可以忽略不计。
然而,在第一个实例中,值status
是基于实例的。因此,只有Program
的实例具有status的值。因此,如果status
是基于实例的字段,其中Program
的多个实例应保留其自己的status
字段值,那么您应该使用第一个示例。
答案 2 :(得分:0)
OP可能正在寻找Singleton模式。 我个人的观点是,如果一个类只会被实例化一次,那么它首先成为一个类是没有理由的,并且如果这个类的所有方法都被恢复为静态C,则会减少调用开销。功能 - 但这只是我的意见。