使用new进行静态变量初始化会产生代码危险

grv*_*grv 5 c# static constructor static-constructor static-members

我正在研究一些类似这样的代码:

class A
{
   static SomeClass a = new Someclass("asfae");  
}
Run Code Online (Sandbox Code Playgroud)

Someclass包含必需的构造函数.这个代码编译好没有任何警告.但是我在系统中遇到代码危险:

"已经从静态构造函数和/或静态初始化器调用了Someclass ctor"

这个代码危害了系统的一部分,只是为了通过警告系统中可能存在的缺陷或系统因此而陷入不良状态来使其更好.我在网上的某处读到静态构造函数/初始化程序可以在c#中等待线程完成时陷入死锁.这与此有关吗?

我需要摆脱这个警告我该怎么做呢.由于静态函数使用它,我不能使该成员为静态.在这种情况下我该怎么做,需要帮助.

Jon*_*erg 1

您可以将其隐藏在属性后面并在首次使用时初始化它(不是线程安全的);

class A
{
    static SomeClass aField;

    static SomeClass aProperty
    {
        get
        {
           if (aField == null) { aField = new Someclass("asfae"); }
           return aField;
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

或使用 Lazy(线程安全):

class A
{
    static Lazy<SomeClass> a = new Lazy<SomeClass>(() => new Someclass("asfae"));
}
Run Code Online (Sandbox Code Playgroud)

...或者这个非常冗长的线程安全版本:)

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;
           }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)