如果我的类中有一个静态成员变量,我应该在哪里初始化它,并设置它的所有属性?
class Foo
{
static public Timer t;
private int foo;
public Foo(int f)
{
this.foo = f;
}
}
如您所见,我的类具有成员变量private int foo
,其设置为与构造函数的参数匹配。我也得到了static public Timer t
,它应该为这个班级的每个等级打勾。现在我的问题是,我应该在哪里添加此代码:
t = new Timer();
t.Interval = 1;
因为如果我将它添加到我的类的构造函数中,每次创建一个新实例时都会调用它,这不是我想要的。我可以将t = new Timer();
移动到实际的变量声明中,如下所示:static public Timer t = new Timer();
但我仍然需要在某处插入t.Interval = 1;
。
所以问题是,如何初始化一个静态成员 - 以及如何编辑其属性 - 只有一次,而不是每次我创建一个新实例?
答案 0 :(得分:3)
我会给你一些与其他大多数回复略有不同的建议。
我说你应该尽可能避免使用静态构造函数。
原因之一是效率。详细信息过于复杂,无法进入此处,但请参阅这些页面了解详细信息:
http://ericlippert.com/2013/02/06/static-constructors-part-one/
http://blogs.msdn.com/b/brada/archive/2004/04/17/115300.aspx?Redirected=true
老实说,担心可能不是太多,但因为避免静态构造函数这么简单,你应该这样做。
您所做的是编写一个静态方法,该方法将返回一个值,您可以使用该方法初始化静态字段。
对于您的Timer示例,它看起来像这样:
private static Timer _timer = InitTimer();
private static Timer InitTimer()
{
Timer result = new Timer {Interval = 100};
return result;
}
虽然对于这样的简单初始化,甚至不需要编写单独的方法,因为你可以这样做:
private static Timer _timer = new Timer {Interval = 100};
但在更复杂的情况下,你可以写一个静态方法。
答案 1 :(得分:2)
您可以在Static Constructor中添加此代码,如下所示:
static Foo()
{
t = new Timer();
t.Interval = 1;
}
来自MSDN:
静态构造函数用于初始化任何静态数据,或者 执行仅需要执行一次的特定操作。它是 在创建第一个实例之前自动调用或任何 静态成员被引用。
答案 2 :(得分:2)
Static Constructors用于此目的。
答案 3 :(得分:1)
答案 4 :(得分:0)
以下是两种方法:
static public Timer t = new Timer
{
Interval = 1
};
static public Timer t;
static Foo
{
t = new Timer();
t.Interval = 1;
}