注意:对于那些来自 Ruby 世界或 C# 世界的人,Ruby 的地图可以与 C# 的字典相媲美。
我会说这是需要的,尤其是在惯用的 C# 中。在 Ruby 中,您可以简单地通过初始化来声明变量,就像您可以从哈希中为未初始化的键检索默认值一样(或者以同样的方式初始化值)。
鲁比:
some_variable = 40
retrieved_value = some_hash['key'] // returns default string
C#:
int some_variable = 40;
Dictionary<string,string> someDictionary = new Dictionary<string,string>();
string retrievedValue = someDictionary["key"]; // THROWS EXCEPTION
someDictionary.Add("key", "value");
似乎在像 C# 这样的静态语言中,想法是在尝试之前预先知道某些东西会按照您的预期工作。 C# 没有回退(如 Ruby 默认值),而是希望您在尝试访问之前知道那里有一些东西。
您可能会认为 Ruby 哈希检索具有两种行为。如果那里有一个值,它会检索它。如果不是,则将其初始化为默认值。我认为这就是 C# 不以这种方式处理它的原因。最重要的是,除非观察到上下文,否则语句的目的(无论是获取现有变量还是有意创建变量)通常是模棱两可的,即使有上下文也很难。
然而,有趣的是,C# 如何处理 assignment 到字典。到目前为止显示的所有内容在命令式 C# 和富有表现力的 Ruby 之间都有明显的区别。但是,在 C# 中,您可以执行以下操作:
Dictionary<int,int> myDictionary = new Dictionary<int,int>;
myDictionary[3] = 4;
这只是以下的简写仅当字典中不存在键 3 时
myDictionary.Add(3,4);
在这里,我们看到了 Ruby 哈希检索中存在的一些潜在歧义; myDictionary[3] = 4; 如果字典没有 3 条目(将新条目初始化为 4),将做一件事,如果它确实有 3 条目(将其当前值替换为 4),则做另一件事。
或者,myDictionary.Add(3,4); 如果已经有 3 的条目,则会引发异常。对我来说,这感觉更像是一种静态命令式语言,我的意思是“我知道myDictionary 没有 3 作为键,现在我正在添加它”,而其他语法以及 Ruby 的承诺不那么重要。
编辑:感谢 Neolisk,增加了 dictionary.Add() 和 dicitonary[3]=4 之间的区别