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

本文关键字:实例化 成员 我的 静态 只读 为什么 | 更新日期: 2023-09-27 17:50:15

我在自定义类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时,它都会这样做

是ValidatedProperties被重写每次我创建另一个Foo对象?还是因为Console.WriteLine,它只是再次显示每个属性?

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

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

只读仅表示该列表不能被另一个列表替换,并不表示列表的内容不能更改。

我有一种感觉,你想做的是有一个单一的列表,是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来自一些外部来源(例如数据库,web服务,文件),它会更容易填充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" });