C#靜態常量默認初始化,但仍然為null
阿新 • • 發佈:2019-02-11
span arr 靜態常量 項目 tps 不清楚 ask .sh ons
最近在做一個項目的時候,發現標記了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 = newList<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去啟動一個線程,一定要小心線程復用的問題
C#靜態常量默認初始化,但仍然為null