任何人都可以解释为什么C#中的Dictionary <>不像STL中的map <T,U>那样工作?

Dav*_*ave 5 c# dictionary stl map

去年我第一次开始使用C#进行编程时,我立即寻找了与STL相同的地图,并学习了Dictionary.

更新了下面的垃圾,我完全错了.我与STL的地图的经验是,我讨厌当我要求它的价值,如果关键在地图上没有,它会自动创建值类型(无论其默认构造函数所做的那样),并将其添加到地图中.然后我必须在代码中检查这个条件并抛出异常.

字典<>使整个shebang正确 - 如果键不存在,它会在您请求值时抛出异常,或者如果不是,则自动添加它并且您想要设置该值.

但你们都已经知道了.我应该在发布之前编写我的单元测试并让自己感到尴尬.:)他们现在写的!

现在我喜欢Dictionary和all,但是现在最让我烦恼的是,如果键不在Dictionary中,它会抛出KeyNotFoundException.因此,我总是需要编写如下代码:

Dictionary<string,string> _mydic;

public string this[string key]
{
  get {
    return _mydic[key]; // could throw KeyNotFoundException
  }
  set {
    if( _mydic.ContainsKey( key))
      _mydic[key] = value;
    else
      _mydic.Add( key, value);
  }
}
Run Code Online (Sandbox Code Playgroud)

如果键不存在,为什么Dictionary不会自动添加键值对,如STL的映射?

现在有趣的是,在以前的生活中,我常常生气,因为我经常不得不试图阻止地图这样做.我想我现在的用例有点不同.

Jon*_*eet 10

如果地图中不存在,您希望它返回哪个值?它可以返回default(TValue)- 但是假设它是正确的,那么意外地使用一个值会有点容易.请注意,如果您需要该行为,可以使用:

get {
  string value;
  if (!_mydic.TryGetValue(key, out value))
    value = default(string);
  return value;
}
Run Code Online (Sandbox Code Playgroud)

我不会亲自推荐它,但是如果你很高兴不能区分(通过这个索引器)一个具有空值和缺失键的键,那么它就可以解决问题.

请注意,你的二传手可以让我更简单 - 只是

_mydic[key] = value;
Run Code Online (Sandbox Code Playgroud)

必要时会覆盖.

  • 否 - [] setter将根据需要添加或覆盖. (2认同)
  • @ 280Z28:为什么?关于`out`参数的规则是该方法必须为所有执行路径设置它. (2认同)