【发布时间】:2011-12-26 13:14:58
【问题描述】:
我正在创建一个具有某种键值对的类。目前,我有类似以下内容:
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>>();
我也永远不会遍历集合,只能通过键访问。
【问题讨论】:
-
“我只会从集合中添加-删除东西”是什么意思?
-
@SteveDanner,例如我永远不会去
PropertyCache = new Dictionary<Type, List<PropertyInfo>>,只有PropertyCache.Add(item):) -
好的,ReadOnlyDictionary 将无法工作。考虑一下 Jon Skeet 的回答,IMO。
-
您问:“这是以线程安全方法实现的正确方法吗?”答案是响亮的“不”。标记静态的东西与线程安全无关。它只是将对象标记为在对象实例之间共享。共享。所有实例都可以访问同一个对象。对象本身(或试图访问它的代码)必须在访问时实现线程安全逻辑。
标签: c# collections thread-safety