我正在编写一些类似这样的代码:
class A
{
static SomeClass a = new Someclass("asfae");
}
某个类包含所需的构造函数。 此代码编译正常,没有任何警告。但是我在系统中遇到代码危险:
"The Someclass ctor has been called from static constructor and/or static initialiser"
这个代码危害系统的一部分只是为了通过警告系统中可能存在的缺陷或者系统是否因此进入不良状态来使其变得更好。 我在网上的某个地方读到,如果静态构造函数/初始化程序等待线程完成,它们可能会在 C# 中陷入死锁。跟这个有关系吗?
我需要摆脱这个警告我该怎么做。 我不能使成员成为非静态成员,因为它由静态函数使用。 这种情况我该怎么办,需要帮助。
最佳答案
您可以将其隐藏在属性后面并在首次使用时对其进行初始化(非线程安全);
class A
{
static SomeClass aField;
static SomeClass aProperty
{
get
{
if (aField == null) { aField = new Someclass("asfae"); }
return aField;
}
}
}
或使用 Lazy(线程安全):
class A
{
static Lazy<SomeClass> a = new Lazy<SomeClass>(() => new Someclass("asfae"));
}
...或者这个非常冗长的线程安全版本:)
class A
{
static SomeClass aField;
static object aFieldLock = new object();
static SomeClass aProperty
{
get
{
lock (aFieldLock)
{
if (aField == null) { aField = new Someclass("asfae"); }
return aField;
}
}
}
}
关于c# - 使用 new 的静态变量初始化会产生代码风险,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22196483/