Sun*_*Sun 10 .net c# dictionary
如果我确定在我到达访问代码的时候它会被添加到字典中,我应该检查字典中是否存在特定键 吗?
我可以通过两种方式访问字典中的值
要么
(如果我想获得价值,第二名将比第一名表现更好.基准.)
但是,如果我确定正在访问全局字典的函数肯定会有密钥,那么我仍然应该使用TryGetValue检查或不检查我应该使用indexer [].
或者我永远不应该假设并经常检查?
Jon*_*eet 18
如果要存在密钥,请使用索引器 - 如果它不存在,它将抛出适当的异常,如果没有密钥表明存在错误,这是正确的行为.
如果对于不存在的密钥有效,请TryGetValue改为使用并做出相应的反应.
(同时应用Marc关于安全访问共享字典的建议.)
Mar*_*ell 10
如果字典是全局的(静态/共享),您应该同步对它的访问(这很重要;否则您可能会破坏它).
即使您的线程只读取数据,它也需要尊重可能正在编辑它的其他线程的锁.
然而; 如果您确定该项目在那里,索引器应该没问题:
Foo foo;
lock(syncLock) {
foo = data[key];
}
// use foo...
Run Code Online (Sandbox Code Playgroud)
否则,一个有用的模式是检查并添加相同的锁:
Foo foo;
lock(syncLock) {
if(!data.TryGetValue(key, out foo)) {
foo = new Foo(key);
data.Add(key, foo);
}
}
// use foo...
Run Code Online (Sandbox Code Playgroud)
这里我们只添加项目,如果它不在那里......但在同一个锁内.