我正在创建一个具有某种键值对的类。目前,我有类似以下内容:
private static Dictionary<Type, List<PropertyInfo>> PropertyCache { get; set; }
这是线程安全方法的正确实现方法吗?由于某种原因,在这种情况下,static
对 Dictionary
的影响一直困扰着我。如果这是正确的,是否有可以演示的错误方法,以便我可以在代码的其余部分中避免它。
此外,它应该是只读的(我只会从集合中添加或删除内容)吗?
如果有区别,该属性将始终被声明为私有(private)
。
提前致谢
虽然标记为 C#,但 VB 中的答案还可以,可以说我是“双语”
编辑:
在 Jon Skeet 在他的答案的评论中进行讨论后,用法将是:
// I will do this
PropertyCache.Add(typeof(string), new List<PropertyInfo>());
PropertyCache.Remove(typeof(string));
// I will never do this
PropertyCache = new Dictionary<Type, List<PropertyInfo>>();
我也永远不会迭代该集合,只会通过键访问。
最佳答案
您可能应该将其设置为只读,除非您需要更改变量的值,是的。
如果您使用 .NET 4,则应考虑使用 ConcurrentDictionary
- 否则,我可能会编写只为每次访问获取一个锁的访问器。虽然您可以使用ReaderWriterLockSlim
等,但我个人会选择最简单的安全方法来开始。
请注意,以线程安全的方式迭代字典的内容会很棘手 - 但希望您不需要这样做。
关于c# - 对静态集合的线程安全访问,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8086449/