该课程如下:
public static class CacheManager
{
private static Dictionary<string, object> cacheItems = new Dictionary<string, object>();
private static ReaderWriterLockSlim locker = new ReaderWriterLockSlim();
public static Dictionary<string, object> CacheItems
{
get
{
return cacheItems;
}
}
...
}
也应该使用ReaderWriterLockSlim锁定器对象。
客户端现在看起来如下:
foreach (KeyValuePair<string, object> dictItem in CacheManager.CacheItems)
{
...
}
提前谢谢。
答案 0 :(得分:6)
如果你只需要迭代内容,那么坦率地说它并没有真正用作字典,但是迭代器块和索引器可能用于隐藏内部对象:
public IEnumerable<KeyValuePair<string, object>> CacheItems
{
get
{ // we are not exposing the raw dictionary now
foreach(var item in cacheItems) yield return item;
}
}
public object this[string key] { get { return cacheItems[key]; } }
答案 1 :(得分:2)
这个属性怎么样:
public static IEnumerable<KeyValuePair<string, object> CacheItems
{
get
{
return cacheItems;
}
}
Dictionary实现了IEnumerable接口(你的foreach语句已经使用过),但是只将它暴露为IEnumerable,你就可以防止在字典中添加或删除项目。
如果需要通过索引操作符访问字典,则可以非常轻松地实现ReadOnlyDictionary。它看起来像这样:
public class ReadOnlyDictionary<TKey, TValue> : IDictionary<TKey, TValue>
{
private IDictionary<TKey, TValue> _Source;
public ReadOnlyDictionary(IDictionary<TKey, TValue> source)
{
if(source == null)
throw new ArgumentNullException("source");
_Source = source;
}
// ToDo: Implement all methods of IDictionary and simply forward
// anything to the _Source, except the Add, Remove, etc. methods
// will directly throw an NotSupportedException.
}
在这种情况下,您还可以将缓存传播为
private static ReadOnlyDictionary<string, object> _CacheReadOnly;
private static Dictionary<string, object> _CacheItems;
public static ctor()
{
_CacheItems = new Dictionary<string, object>();
_CacheReadOnly = new ReadOnlyDictionary(_CacheItems);
}
public static IDictionary<string, object> CacheItems
{
get
{
return CacheReadOnly;
}
}
如果你真的需要阻止强制转换为字典,你也可以使用它:
public static IEnumerable<KeyValuePair<string, object> CacheItems
{
get
{
return cacheItems.Select(x => x);
}
}
答案 2 :(得分:1)
在过滤的字典上公开一个只读视图的属性?公开允许访问迭代的方法。
究竟是什么问题? “没有将字典公开为公开”,这是模糊不清的,这是不可回答的。
答案 3 :(得分:0)
根据字典的大小,您可以使用MemberwiseClone。
您可能还想查看IsReadOnly属性。