C#有没有办法给我一个不可变的字典?
2022-08-31 13:41:11
核心 C# 库中是否内置了任何内容,可以给我一个不可变的字典?
类似于Java的东西:
Collections.unmodifiableMap(myMap);
澄清一下,我并不是想阻止键/值本身被改变,只是想阻止字典的结构。我想要一些快速而响亮的东西,如果IDictionary的任何突变体方法被称为()。Add, Remove, Clear
核心 C# 库中是否内置了任何内容,可以给我一个不可变的字典?
类似于Java的东西:
Collections.unmodifiableMap(myMap);
澄清一下,我并不是想阻止键/值本身被改变,只是想阻止字典的结构。我想要一些快速而响亮的东西,如果IDictionary的任何突变体方法被称为()。Add, Remove, Clear
不,但包装器是相当微不足道的:
public class ReadOnlyDictionary<TKey, TValue> : IDictionary<TKey, TValue>
{
IDictionary<TKey, TValue> _dict;
public ReadOnlyDictionary(IDictionary<TKey, TValue> backingDict)
{
_dict = backingDict;
}
public void Add(TKey key, TValue value)
{
throw new InvalidOperationException();
}
public bool ContainsKey(TKey key)
{
return _dict.ContainsKey(key);
}
public ICollection<TKey> Keys
{
get { return _dict.Keys; }
}
public bool Remove(TKey key)
{
throw new InvalidOperationException();
}
public bool TryGetValue(TKey key, out TValue value)
{
return _dict.TryGetValue(key, out value);
}
public ICollection<TValue> Values
{
get { return _dict.Values; }
}
public TValue this[TKey key]
{
get { return _dict[key]; }
set { throw new InvalidOperationException(); }
}
public void Add(KeyValuePair<TKey, TValue> item)
{
throw new InvalidOperationException();
}
public void Clear()
{
throw new InvalidOperationException();
}
public bool Contains(KeyValuePair<TKey, TValue> item)
{
return _dict.Contains(item);
}
public void CopyTo(KeyValuePair<TKey, TValue>[] array, int arrayIndex)
{
_dict.CopyTo(array, arrayIndex);
}
public int Count
{
get { return _dict.Count; }
}
public bool IsReadOnly
{
get { return true; }
}
public bool Remove(KeyValuePair<TKey, TValue> item)
{
throw new InvalidOperationException();
}
public IEnumerator<KeyValuePair<TKey, TValue>> GetEnumerator()
{
return _dict.GetEnumerator();
}
System.Collections.IEnumerator
System.Collections.IEnumerable.GetEnumerator()
{
return ((System.Collections.IEnumerable)_dict).GetEnumerator();
}
}
显然,如果要允许修改值,可以更改上面的 this[] setter。