我在我的只读属性中返回对字典的引用.如何防止消费者更改我的数据?如果这是一个IList我可以简单地返回它AsReadOnly.我能用字典做些什么吗?
Private _mydictionary As Dictionary(Of String, String)
Public ReadOnly Property MyDictionary() As Dictionary(Of String, String)
Get
Return _mydictionary
End Get
End Property
Run Code Online (Sandbox Code Playgroud) 创建常量(从不在运行时更改)将strings 映射到ints 的最有效方法是什么?
我尝试过使用const词典,但是没有用.
我可以用适当的语义实现一个不可变的包装器,但这似乎仍然不完全正确.
对于那些曾经问过的人,我正在生成的类中实现IDataErrorInfo,并且正在寻找一种方法来将columnName查找到我的描述符数组中.
我没有意识到(测试时错字!d!哦!)开关接受字符串,这就是我要用的东西.谢谢!
我在C#中有一个包含字典的类,我想创建它并确保在该字典中添加,编辑或删除任何内容,只要包含它的类存在即可.
readonly并没有真正的帮助,一旦我测试并看到我可以添加项目.例如,我创建了一个例子:
public class DictContainer
{
private readonly Dictionary<int, int> myDictionary;
public DictContainer()
{
myDictionary = GetDictionary();
}
private Dictionary<int, int> GetDictionary()
{
Dictionary<int, int> myDictionary = new Dictionary<int, int>();
myDictionary.Add(1, 2);
myDictionary.Add(2, 4);
myDictionary.Add(3, 6);
return myDictionary;
}
public void Add(int key, int value)
{
myDictionary.Add(key, value);
}
}
Run Code Online (Sandbox Code Playgroud)
我希望Add方法不起作用.如果可能的话,我希望它甚至不能编译.有什么建议?
实际上,我很担心代码会让很多人改变.因此,即使我隐藏了Add方法,某人也可能"无辜地"创建一个添加密钥或删除另一个密钥的方法.我希望人们看起来并知道他们不应该以任何方式改变字典.就像我有一个const变量一样.
来自msdn:
表示键/值对的通用只读集合.
但请考虑以下事项
class Test
{
public IReadOnlyDictionary<string, string> Dictionary { get; } = new Dictionary<string, string>
{
{ "1", "111" },
{ "2", "222" },
{ "3", "333" },
};
public IReadOnlyList<string> List { get; } =
(new List<string> { "1", "2", "3" }).AsReadOnly();
}
class Program
{
static void Main(string[] args)
{
var test = new Test();
var dictionary = (Dictionary<string, string>)test.Dictionary; // possible
dictionary.Add("4", "444"); // possible
dictionary.Remove("3"); // possible
var list = (List<string>)test.List; // …Run Code Online (Sandbox Code Playgroud) 怀旧的Collections.unmodifiableMap(),我一直在实现IDictionary基于这个讨论的只读包装器,我的单元测试很快遇到了一个问题:
Assert.AreEqual (backingDictionary, readOnlyDictionary);
Run Code Online (Sandbox Code Playgroud)
即使键值对匹配,也会失败.我玩了一下,看起来至少(感谢Simonyi)
Assert.AreEquals (backingDictionary, new Dictionary<..> { /* same contents */ });
Run Code Online (Sandbox Code Playgroud)
确实过去了.
我刚刚看了一下通过Dictionary和IDictionary文档,并让我吃惊我找不到了Java的任何等同Map合约的两个Maps相等entrySet()s必须相等.(文档说Dictionary- 不 IDictionary - 覆盖Equals(),但不要说覆盖的内容.)
所以看起来C#中的键值相等是Dictionary具体类的属性,而不是IDictionary接口的属性.这是正确的吗?整个System.Collections框架通常是否正确?
如果是这样,我有兴趣阅读一些关于为什么MS选择这种方法的讨论 - 以及在C#中检查集合内容是否相同的首选方法.
最后,我不介意指向经过良好测试的ReadOnlyDictionary实现.:)
ETA:要明确,我不是在寻找关于如何测试我的实现的建议 - 这是相对微不足道的.我正在寻找有关这些测试应该强制执行的合同的指导.为什么呢.
ETA:伙计们,我知道 IDictionary是一个接口,我知道接口无法实现方法.在Java中也是如此.然而,Java Map接口记录了该方法的某些行为的期望equals().当然必须有.NET接口执行这样的操作,即使集合接口不在其中.
可能重复:
.NET中是否有只读的通用字典?
嗨,大家好,
我意识到可以将列表作为只读集合返回:
var list = new List<string>();
return list.AsReadOnly();
Run Code Online (Sandbox Code Playgroud)
我想为像Dictionary或HashSet这样的数据结构编写类似的代码,但我没有找到实现这一目标的方法.有没有办法将Dictionary或HashSet作为只读集合返回?
谢谢.
我想知道我是否可以创建一个返回只读字典的属性?
例:
Run Code Online (Sandbox Code Playgroud)private readonly Dictionary<string, IMyObject> _myDictionary; public Dictionary<string, IMyObject> MyDictionary { get { return _myDictionary; } }
因此,不允许使用MyDictionary的人添加,删除或更改项目.有什么方法可以做到这一点?
.net ×5
c# ×5
dictionary ×4
collections ×2
immutability ×2
readonly ×2
constants ×1
equality ×1
java ×1