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去啟動一個線程,一定要小心線程復用的問題

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM