c# - 使用 new 的静态变量初始化会产生代码风险

标签 c# constructor static static-members static-constructor

我正在编写一些类似这样的代码:

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/

相关文章:

java - 为什么程序不允许初始化静态最终变量?

c# - 具有缓冲区和线程安全的 FIFO/QUEUE

c# - C# "Random"访问大文件

c# - ASP.NET MVC : How to obtain assembly information from HtmlHelper instance?

java - 是否有 Lombok 方法来初始化从其他字段计算的最终字段?

java - 内部静态类的新实例在 Lollipop 之前的设备中具有不同顺序的变量

c# - 我如何从 Windows 商店应用程序获取 wifi AP 列表并连接到一个 AP

c++ - 为什么在 C++ 中需要复制构造函数来声明和初始化对象?

header 中的 C++ 数组

c# - 获取和设置简单的静态属性线程安全吗?