为什么在 ConfigurationManager.AppSettings[key] 上调用 .ToString()?

Why call .ToString() on ConfigurationManager.AppSettings[key]?

我不确定这是否会归结为意见问题,但我一直在代码中看到一个我不理解的模式。

在所有 C# 应用程序中,我不断看到表达式:

System.Configuration.ConfigurationManager.AppSettings["key"].ToString()

很长一段时间我都以为这只是我工作的地方的怪癖,但我搜索了一下,看来这不仅仅是一些一次性的事情。人们做了相当多的事情,但据我所知并没有真正谈论它。

这个blog, for example, makes sure to call .ToString() on AppSettings, and so does this blog

此外,all the programmers on this question 确保对 AppSettings 集合调用 .ToString()

为了确保我不会发疯,我翻阅了 Visual Studio 中的方法,这向我保证,是的,AppSettings[key] 是强类型字符串,并且 "no actual conversion is performed" 调用 .ToString().

在我看来,AppSettings[key]AppSettings[key].ToString() 之间唯一真正的区别是抛出 NullReferenceException 的可能性。

所以我的问题是:

这样做是否有任何技术原因,或者出于某种原因它是广泛推荐的 C# 最佳实践,还是它只是一个没有实际意义的怪癖?

Is there any technical reason for doing this, or is it a widely-recommended C# best practice for some reason, or is it just a weird quirk with no real meaning?

后者。调用 ToString 没有用。只会害人害己。

ConfigurationManager.AppSettingsNameValueCollection 类型,访问者 returns a string already 就是其中的类型。调用 ToString 只能导致 NullReferenceException。它没有任何积极影响。

我认为这样的代码可能存在的一个强有力的理由是,它可能最初是在 ConfigurationManager 引入 .NET 2 之前编写的 1

以前,访问 Configuration class 时其 AppSettings 属性 会返回 AppSettingsSection。是的,不幸的是,有一个 returns object 而不是 string.

的索引器

在将他们的代码升级到 .NET 2 时,他们会看到使用 ConfigurationManager 的建议,并且将执行最少的编辑量以使他们的代码使用此 class .并没有想到 about/considered 删除现在多余的尾随 ToString()


1评论里说的,估计是很久以前写的,很久以前升级的。但这种代码会被大量复制和粘贴,因此几乎会像病毒式传播一样永久存在。