为什么我的静态只读成员多次实例化?

时间:2014-03-14 18:58:38

标签: c# static readonly

我在自定义类Foo中有static readonly List<string> ValidatedProperties = new List<string>();,在Foo的构造函数中我调用

protected Foo()
{
    foreach(var prop in properties)
    {
        ValidatedProperties.Add(prop.Name);
        Console.WriteLine(prop.Name);
    }
}

当我创建一个新的Foo时,它会按预期打印出来,但是,它会在每次时创建一个新的Foo。

每次创建另一个Foo对象时,是否重写了ValidatedProperties?或者是因为Console.WriteLine而只是再次显示每个属性?

2 个答案:

答案 0 :(得分:4)

每次创建Foo实例时,都会向ValidatedProperties添加一个条目。

只读意味着List不能被其他列表替换 - 这并不意味着列表的内容不能改变。

答案 1 :(得分:3)

我感觉你要做的是拥有一个在Foo的所有实例之间共享的列表,但只填充一次。也许你想要一个静态构造函数:

static Foo()
{
    // note that properties needs to be static too!
    foreach(var prop in properties)
    {
        ValidatedProperties.Add(prop.Name);
        Console.WriteLine(prop.Name);
    }
}

public Foo()
{
    // regular constructor for creating an instance of Foo
}

虽然,除非properties来自某些外部来源(例如数据库,网络服务,文件),否则在声明时填充ValidatedProperties要容易得多:

static readonly List<string> ValidatedProperties = new List<string>() { "foo", "bar" }

您甚至可以使用ReadOnlyCollection<string>来阻止任何人稍后添加它:

static readonly ReadOnlyCollection<string> ValidatedProperties = 
    new ReadOnlyCollection<string>(new string[] {"foo", "bar" });