zoukankan      html  css  js  c++  java
  • C#静态常量默认初始化,但仍然为null

    最近在做一个项目的时候,发现标记了ThreadStatic特性的静态变量,即使默认已经初始化,但在使用的时候仍然可能为NULL,以下是一段测试代码:

    (不清楚ThreadStatic的可以点击这https://docs.microsoft.com/en-us/dotnet/api/system.threadstaticattribute)

        public class Program
        {
            
            public static void Main(string[] args)
            {
                List<Task> tasks = new List<Task>();
                for (int i = 0; i < 10; i++)
                {
                    Task task = Task.Run(() => new ShowString().Show());
                    tasks.Add(task);
                }
    
                Task.WaitAll(tasks.ToArray());
            }
        }
    
        public class StaticClass
        {
            [ThreadStatic]
            public static Dictionary<string,object> StaticDict = new Dictionary<string, object>();
        }
    
        public class ShowString
        {
            public void Show()
            {
                Console.WriteLine(StaticClass.StaticDict.Count);
            }
        }

    在以上代码可以看到,在声明StaticClass.StaticDict的时候就已经进行了初始化,但是在实际的运行过程中会出现为NULL的情况。

    解决方法:修改StaticClass为如下代码:

        public class StaticClass
        {
            [ThreadStatic]
            private static Dictionary<string,object> _staticDict = null;
    
            public static Dictionary<string, object> StaticDict
            {
                get
                {
                    _staticDict = _staticDict ?? new Dictionary<string, object>();
                    return _staticDict;
                }
            }
        }

    注意:在使用ThreadStatic 时,如果使用Task去启动一个线程,一定要小心线程复用的问题

  • 相关阅读:
    IntelliJ IDEA 2020.1.1中java web项目的配置
    Js查漏补缺10-数组、栈、队列、回调函数等
    Js查漏补缺09-this对象
    Js查漏补缺08-闭包
    Js查漏补缺07-匿名函数应用到的框架
    Js查漏补缺06-匿名函数的用法
    Js查漏补缺05-函数
    Js查漏补缺04-Object类型
    Js查漏补缺03-循环结构
    Runnabler
  • 原文地址:https://www.cnblogs.com/zhurongbo/p/10362508.html
Copyright © 2011-2022 走看看