在访问之前,我应该检查Dictionary中是否存在特定键吗?

Sun*_*Sun 10 .net c# dictionary

如果我确定在我到达访问代码的时候它会被添加到字典中,我应该检查字典中是否存在特定键 吗?

我可以通过两种方式访问​​字典中的值

  1. 检查ContainsKey方法.如果它返回true,那么我使用字典对象的索引器[key]访问.

要么

  1. TryGetValue将返回true或false以及通过out参数返回值.

(如果我想获得价值,第二名将比第一名表现更好.基准.)

但是,如果我确定正在访问全局字典的函数肯定会有密钥,那么我仍然应该使用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)

这里我们只添加项目,如果它不在那里......但在同一个锁内.