4

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

我已经阅读了一些更改与指定键关联的值的示例:在调用该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
}
4

2 回答 2

4

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

假设它一开始是可变的,那么使用现有的查找结果绝对是有意义的。您展示的第一段代码毫无意义地低效。

寻找更好的例子:)

于 2012-09-03T08:43:28.343 回答
1

示例代码与实际代码不同。它展示了一个给定的观点,仅此而已。这可能意味着很多示例都不是最佳的(我们都可以保证永远不要ToList()在实际上不需要它的 linq 示例代码中使用它吗?我相信这就是为什么当唯一的效果是使代码变慢时经常使用它的原因) 还有很多毫无意义的。

这甚至都不是坏事。示例代码中的注释将描述正在解释的内容,在实际代码中我们应该期望人们能够理解。同时,它不会记录您为什么要做一些看起来很奇怪的事情,因为这要么在周围的文本中,要么答案只是“因为它展示了这个功能,仅此而已”。在实际代码中,任何令人惊讶或看起来怪异的东西都应该在注释中解释(以及显而易见的原因,如果你不能很好地解释怪异,那么你就不会像你一样有理由认为这种怪异以为你是)。虽然一些初级开发人员的评论可能暗示他们在实际代码中使用前者,但事实是我们想要示例中的注释以解释对了解相关功能的人来说显而易见的内容 - 因为我们不熟悉它们,这就是我们正在阅读示例的目的,

使用可变引用类型,第二个版本确实更明智,坦率地说是一个更好的例子,但作者可能只是想考虑另一个特性的另一个例子,它与我们所承受的心理压力不同在编写真正的代码时。在某些方面恰恰相反(我们希望有名的而不是外来的,而教程作者必须使用每一个特性来解释它们)。

于 2012-09-03T10:21:10.583 回答