看到同事的一段代码,我认为其写法不安全,Key赋值前没有判断Key是否存在,但而我同事坚持认为这没问题。为方便说明我将代码简化成如下
static void Main(string[] args)
{
Dictionary<string, bool> dict = new Dictionary<string, bool>()
{
{ "1", true },
{ "2", false }
};
dict["3"] = false;
}
我认为在执行dict["3"] = false;
时,因不存在key=”3”而引发System.Collections.Generic.KeyNotFoundException:异常。而且文档也是这么说到的
当我信心满满地运行这段代码,并没有看到我要的KeyNotFoundException异常。调试过程中,我发现执行dict["3"] = false;
结束后,{ “3”, false }出现在dict的字典列表中。难道如果Key不存在就追加进字典列表?
怀着不安的挫败感,我找到了.Net关于Dictionary的源代码
https://github.com/dotnet/coreclr/blob/master/src/mscorlib/src/System/Collections/Generic/Dictionary.cs
重载操作符[]的set实现,调用内部Insert方法,而就在下面Add方法也调用了Insert。看到此处一切都明白,也没有必要去看Insert了。
我依然认为操作前判断Key是否存在很有必要。难保日后对Dicionary的实现不作修改,官方文档了好没有提及允许这种不判空的写法,大家小心为慎。