在哪里设置静态成员的属性?

时间:2013-02-28 11:55:27

标签: c# static static-members

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

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;

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

5 个答案:

答案 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)

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

class Foo {

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

请参阅here

答案 4 :(得分:0)

以下是两种方法:

初始化剂

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

静态构造函数

static public Timer t;

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