未调用静态构造函数?

Static constructor not called?

[编辑] 我忘了添加 static 关键字并且没有重新定义它,因为我调用了 class Statics

我正在创建 Blazor 客户端应用程序。

我正在尝试创建一个静态方法,我想从文件中 return 一个随机名称。

public class Statics
{
    private static List<string> _names;

    public Statics()
    {
        var assembly = Assembly.GetExecutingAssembly();
        var resourceName = "[AssemblyName].Stuff.first-names.json";

        using (Stream stream = assembly.GetManifestResourceStream(resourceName))
        using (StreamReader reader = new StreamReader(stream))
        {
            string result = reader.ReadToEnd();
            _names = JsonSerializer.Deserialize<List<string>>(result);
        }
    }

    public static string GetRandomName()
    {
        var random = new Random();
        return _names[random.Next(_names.Count)];
    }
}

我正在尝试在静态构造函数中加载文件,不多次加载文件,而是将名称保存在内存中。

但是当我调用 GetRandomName 方法时,我在列表中得到了一个 nullrefrenceexception

如果我复制代码以将文件加载到方法中,效果很好

   public static string GetRandomName()
    {
        var random = new Random();

        var assembly = Assembly.GetExecutingAssembly();
        var resourceName = "[AssemblyName].Stuff.first-names.json";

        using (Stream stream = assembly.GetManifestResourceStream(resourceName))
        using (StreamReader reader = new StreamReader(stream))
        {
            string result = reader.ReadToEnd();
            _names = JsonSerializer.Deserialize<List<string>>(result);
        }

        return _names[random.Next(_names.Count)];
    }

我也试过用构造函数中的任何字符串填充列表(这也没有用)

 public class Statics
{
    private static List<string> _names;

    public Statics()
    {
        _names = new List<string>() { "hello", "World", "Something" };
    }

    public static string GetRandomName()
    {
        var random = new Random();

        return _names[random.Next(_names.Count)];
    }
}

我理解 c# 中静态构造函数的概念是

当您使用静态构造函数在静态 class 中引用字段或 属性 时。 您可以确保构造函数将 运行 在您访问该字段之前或 属性 (但您无法精确控制时间)。

我的代码有问题吗?我的理解?还是西装单声道 运行time?

您的 class 没有静态构造函数。 public Statics() 是实例构造函数。要成为静态构造函数,您需要使用 static 关键字(并删除 public 修饰符)。

所以改变这个:

public Statics()

static Statics()

...我怀疑一切都会正常工作,尽管如果您的 class 是 真的 只是为了包含静态成员,您可能希望将其声明为静态 class 也是。

我至少还要注意不要在静态构造函数中做太多工作。类型初始值设定项(包括静态构造函数)中的问题可能很难解决 - 目前,同步 IO 所处的位置对于使用您的代码的任何东西来说都很难改变时间。

也许没关系 - 这只是需要注意的事情。