未调用静态构造函数?
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 所处的位置对于使用您的代码的任何东西来说都很难改变时间。
也许没关系 - 这只是需要注意的事情。
[编辑] 我忘了添加 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 所处的位置对于使用您的代码的任何东西来说都很难改变时间。
也许没关系 - 这只是需要注意的事情。