C#-静态只读字符串-可能会遇到多线程问题

本文关键字:遇到 多线程 问题 静态 只读 字符串 C#- | 更新日期: 2023-09-27 17:59:16

public class MyClass<T>
{
    public static readonly String MyStringValue;
    static MyClass()
    {
        MyStringValue = GenerateString();
    }
    private static String GenerateString()
    {
        //Dynamically generated ONCE per type (hence, not const)
    }
    public void Foo()
    {
        Console.WriteLine(MyStringValue);
    }
}

我的理解是,在类上调用静态构造函数之前,不会生成静态只读字符串。但是,在访问其中一个静态方法或变量之前,不会调用静态构造函数。

在多线程环境中,是否可能因此而遇到问题?基本上,静态构造函数在默认情况下是单例锁定的,还是我必须自己完成?那就是…我必须做以下事情吗:

private static Object MyLock;
static MyClass()
{
    lock(MyLock)
    {
        if (MyStringValue == null)
            MyStringValue = GenerateString();
    }
}

C#-静态只读字符串-可能会遇到多线程问题

静态构造函数保证每个实例化类型只运行一次。所以你不需要锁。

请注意,它将为每个泛型参数运行一次。泛型类上的静态字段也不会在不同的泛型参数之间共享。

为了避免这种情况,为什么不将该值设为静态属性,只使用一个返回缓存值的get访问器,然后将其设为私有?访问属性get将确保首先运行静态构造函数。