字典(C#或其他语言)只是一个容器,您可以在其中基于键查找值。在许多语言中,可以更正确地将其标识为Map,最常见的实现是HashMap。
要考虑的问题是当密钥不存在时会发生什么。某些语言通过返回null
或nil
或其他等效值来表现。默默地默认为一个值,而不是通知您不存在值。
不管是好是坏,C#库设计人员想出了一个习惯来应对这种行为。他们认为查找不存在的值的默认行为是引发异常。如果要避免异常,则可以使用Try
变体。这与将字符串解析为整数或日期/时间对象所使用的方法相同。本质上,影响是这样的:
T count = int.Parse("12T45"); // throws exception
if (int.TryParse("12T45", out count))
{
// Does not throw exception
}
然后继续到字典,其索引器将其委托给Get(index)
:
var myvalue = dict["12345"]; // throws exception
myvalue = dict.Get("12345"); // throws exception
if (dict.TryGet("12345", out myvalue))
{
// Does not throw exception
}
这只是语言的设计方式。
应该out
不鼓励使用变量吗?
C#不是拥有它们的第一种语言,它们在特定情况下有其用途。如果要构建高度并发的系统,则不能out
在并发边界使用变量。
在许多方面,如果语言和核心库提供程序支持某个惯用语,我会尝试在我的API中采用这些惯用语。这样一来,API就会以该语言呈现出更加一致的效果。因此,用Ruby编写的方法看起来不会像用C#,C或Python编写的方法。他们每个人都有一种首选的代码构建方式,并且与之一起使用可帮助您的API用户更快地学习它。
地图一般是反模式吗?
他们有自己的目标,但是很多时候,对于您的目标,它们可能是错误的解决方案。特别是如果您有双向映射,则需要。有许多容器和组织数据的方式。您可以使用多种方法,有时在选择该容器之前需要三思。
如果双向映射值列表很短,则可能只需要一个元组列表。或结构列表,您可以在其中轻松找到映射两侧的第一个匹配项。
考虑问题领域,并选择最适合该工作的工具。如果没有,则创建它。