2012-09-03 46 views
3

如果Dictionary<TKey, TValue>.TryGetValue方法返回true,则参数value包含与指定键关联的值。当TryGetValue方法返回true时,更新字典中的值

我已阅读改变与指定键相关联的值的一些示例:调用TryGetValue方法后,与该键相关联的值的更新由索引器执行,从而导致进一步的访问Dictionary(见下面的代码)。

var d = new Dictionary<string, MyClass>(); 
... 
MyClass obj; 
if (d.TryGetValue(key, out obj)) 
{ 
    d[key].Update(...); // update the value 
} 

obj对象是对与键相关的值的引用。为什么不直接使用该对象来更新值,如下面的代码所示?

MyClass obj; 
if (d.TryGetValue(key, out obj)) 
{ 
    obj.Update(...); // update the value 
} 

回答

1

示例代码与实际代码不同。它展示了一个给定的观点,没有别的。这可能意味着很多示例是次优的(我们是否可以保证绝对不会在实际上并不需要它的linq示例代码中使用ToList()?我相信这就是为什么当唯一的效果是使代码慢)和很多毫无意义的东西。

这甚至不是一件坏事。在示例代码中进行评论将描述正在解释的事情,在真实代码中我们应该期望人们理解。同时它也不会记录你为什么要做一些奇怪的事情,因为它可能在周围的文本中,或者答案只是“因为它只是演示了这个功能,而已”。在真实的代码中,任何令人惊讶或怪异的东西都应该在评论中解释(以及显而易见的理由,如果你不能很好地解释这种古怪的话,那么你就不像你那样怪异以为你是)。虽然一些初级开发人员的评论可能暗示他们以真实代码做前者,但事实是,我们希望通过示例中的评论来解释知道相关功能的人显而易见的一点 - 因为我们不是他们,这就是我们正在阅读的例子,

有了一个可变的引用类型,第二个版本确实更明智,坦率地说是一个更好的例子,但作者大概只是试图想想另一个例子还有另一个特征,这种特征在编写实际代码时会受到不同的心理压力。在某些方面相反(我们希望赞成知名的异国情调,而教程编写者必须使用每一个功能来解释它们)。

4

为什么不直接使用对象来更新值,如下面的代码?

假设它是可变的,那么使用现有的查找结果是绝对有意义的。你所显示的代码的第一部分是毫无意义的低效率。

查找更好的示例:)