2

如果我的类中有一个静态成员变量,我应该在哪里初始化它,并设置它的所有属性?

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;某处插入。

所以问题是,我如何初始化一个静态成员 - 以及我如何编辑它的属性 - 只有一次,而不是每次我创建一个新实例?

4

5 回答 5

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

但在更复杂的情况下,您可以编写静态方法。

于 2013-02-28T12:06:37.343 回答
2

您可以将此代码添加到静态构造函数中,如下所示:

static Foo()
{
    t = new Timer();
    t.Interval = 1;
}

来自 MSDN:

静态构造函数用于初始化任何静态数据,或执行只需要执行一次的特定操作。在创建第一个实例或引用任何静态成员之前自动调用它 。

于 2013-02-28T11:57:03.707 回答
2

静态构造函数用于此目的。

于 2013-02-28T11:57:12.280 回答
1

有静态构造函数。像这样调用它们

class Foo {

static Foo(){
// initialize your timer here
}

这里

于 2013-02-28T11:57:30.940 回答
0

这里有两种方法可以做到这一点:

初始化器

static public Timer t = new Timer
{
    Interval = 1
};

静态构造函数

static public Timer t;

static Foo
{
    t = new Timer();
    t.Interval = 1;
}
于 2013-02-28T11:59:35.470 回答